我发现的大多数关于对 XML 查询进行排序的示例都不包含名称空间。其中一些确实如此,但我没有找到任何在有命名空间时执行查询和排序的示例。
<Search xmlns="http://whatever.whatever.com/gg/whatever">
<BinSet Type="Category">
<Bin>
<BinName>Clothing</BinName>
<BinItemCount>804</BinItemCount>
<BinParameter>
<Name>Category</Name>
<Value>Women's Apparel</Value>
</BinParameter>
</Bin>
<Bin>
<BinName>Tools</BinName>
<BinItemCount>126</BinItemCount>
<BinParameter>
<Name>Category</Name>
<Value>Tools, handtools and hardware</Value>
</BinParameter>
</Bin>
</BinSet>
</Search>
我对 XML 没有任何控制权,所以我必须处理名称空间。此外,XML 中大约有 50 条这样的记录,它只是一个更大的 XML 文件的一部分。
Dim nsuri as string = "http://whatever.whatever.com/gg/whatever"
Dim xpath as string = "dd:Search/dd:BinSet[Type="Category"]/*"
Dim nav As XPathNavigator = doc.CreateNavigator()
Dim exp As XPathExpression = nav.Compile(xpath)
Dim nsmgr As New XmlNamespaceManager(nav.NameTable)
nsmgr.AddNamespace("dd", nsuri)
exp.SetContext(nsmgr)
exp.AddSort("BinParameter/Value", XmlSortOrder.Ascending, XmlCaseOrder.UpperFirst, "en-US", XmlDataType.Text)
' now process in sorted order
Dim iterator As XPathNodeIterator = nav.Select(exp)
While iterator.MoveNext
Dim nav2 As XPathNavigator = iterator.Current.Clone
nav2.MoveToFirstChild()
Debug.WriteLine(nav2.Value)
End While
我看到的所有示例都显示了如何对直接子节点进行排序,例如我的示例 XML 中的 BinName 或 BinItemCount。但我需要所有这些信息,并且需要在 BinParameter/Value 节点上进行排序。我已经尝试了所有我能想到的方法...
最后要注意的一件事,当一切都说完了,我真的不关心使用 XPathNodeIterator 或 XPathNavigator。以前我返回一个包含所有这些记录的 XmlNodeList,我的调用例程将遍历节点列表以形成链接,如下所示:
<a href="mypage.aspx?si=Tools">Tools, handtools and hardware (126)</a>
<a href="mypage.aspx?si=Clothing">Women's Apparel (804)</a>
有谁知道如何使用命名空间通过嵌套的子节点“值”对这个 XML 进行排序?
此外,您是否知道在 XmlNodeList 或其他 .Net 对象中返回排序结果的最快方法,以便我可以访问所有值:BinName、BinItemCount、Name 和 Value?我不熟悉 XPathNavigator 或 XPathNodeIterator。
谢谢你。