XML属性排序问题

大可山人
博客专家认证
2004-04-17 09:48:05
transform.xml文件:
--------------------
<?xml version="1.0" encoding="GB2312" ?>
<sales>
<summary>
<heading>Scootney Publishing</heading>
<subhead>Regional Sales Report</subhead>
<description>Sales report for the West Coast, Central and East Coast regions.</description>
</summary>
<link>
<source>http://www.vcsharp.com</source>
<label>VC#.COM Website</label>
</link>
<ulink source="http://www.vcsharp.net" label="VC#.Net网站"/>
<data>
<region>
<name>West Coast</name>
<quarter number="1" books_sold="24000" />
<quarter number="2" books_sold="38600" />
<quarter number="3" books_sold="44030" />
<quarter number="4" books_sold="21000" />
</region>
<region>
<name>Central</name>
<quarter number="1" books_sold="11000" />
<quarter number="2" books_sold="16080" />
<quarter number="3" books_sold="25000" />
<quarter number="4" books_sold="29000" />
</region>
<region>
<name>East Coast</name>
<quarter number="1" books_sold="27000" />
<quarter number="2" books_sold="31400" />
<quarter number="3" books_sold="40100" />
<quarter number="4" books_sold="30000" />
</region>
</data>
</sales>

sort.aspx
-----------------------
<%@ Page Language="C#" ContentType="text/html" ResponseEncoding="gb2312" %>
<%@ import namespace="System.Xml"%>
<%@ import namespace="System.Xml.XPath"%>
<Script runat="server">
private void Page_Load(object sender, System.EventArgs e)
{
StringBuilder unsorted = new StringBuilder();
StringBuilder sorted = new StringBuilder();
string xpath = "/sales/data/region/quarter/@books_sold";//用这句无法得到正常结果。为什么?
//上句如果是:string xpath = "/sales/data/region/name";可以得到正常结果

XPathDocument doc = new XPathDocument(Server.MapPath("transform.xml"));
XPathNavigator nav = doc.CreateNavigator();

XPathNodeIterator nodeIter1 = nav.Select(xpath);
while (nodeIter1.MoveNext()) {
unsorted.Append(nodeIter1.Current.Value + "<br />");
}
lblUnsorted.Text = unsorted.ToString();

XPathExpression exp = nav.Compile(xpath);
exp.AddSort("text()",XmlSortOrder.Descending,
XmlCaseOrder.None,"",XmlDataType.Number);

XPathNodeIterator nodeIter2 = nav.Select(exp);
while (nodeIter2.MoveNext()) {
sorted.Append(nodeIter2.Current.Value + "<br />");
}
lblSorted.Text = sorted.ToString();
}
</Script>
排序前:<br /><asp:Label runat="server" id="lblUnsorted"/><br/>
排序后:<br />
<font color="red">
<asp:Label runat="server" id="lblSorted"/>
</font>
...全文
126 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
大可山人 2004-04-20
  • 打赏
  • 举报
回复
string xpath = "/sales/data/region/quarter/@books_sold";
...
exp.AddSort(".", XmlSortOrder.Descending,XmlCaseOrder.None,"",XmlDataType.Number);
...

OK!

Thanks saucer!
大可山人 2004-04-18
  • 打赏
  • 举报
回复
照此法报错!

传递给此方法的表达式应产生 NodeSet。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Xml.XPath.XPathException: 传递给此方法的表达式应产生 NodeSet。

问题就是这句:XPathNodeIterator nodeIter1 = nav.Select(xpath);
而string xpath = "number(/sales/data/region/quarter/@books_sold)";
去掉number()不报错,但排序不正常。
saucer 2004-04-18
  • 打赏
  • 举报
回复
yes, you are right, actually, the problem is that you are using "text()", try ".":

exp.AddSort(".", XmlSortOrder.Descending,
XmlCaseOrder.None,"",XmlDataType.Number);
saucer 2004-04-17
  • 打赏
  • 举报
回复
try

string xpath = "number(/sales/data/region/quarter/@books_sold)";

?
大可山人 2004-04-17
  • 打赏
  • 举报
回复
使用:string xpath = "/sales/data/region/quarter/@books_sold";//用这句无法得到正常结果:
排序前后结果均为:
24000
38600
44030
21000
11000
16080
25000
29000
27000
31400
40100
30000

使用:
string xpath = "/sales/data/region/name";
....
exp.AddSort("text()",XmlSortOrder.Descending,
XmlCaseOrder.None,"",XmlDataType.Text);//这里改成Text类型了
...则得到正常结果:
排序前:
West Coast
Central
East Coast

排序后:
West Coast
East Coast
Central

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧