0

我有一个 XML 文档,我想按字母顺序对特定节点进行排序。

XML 文档

<response>
    <lst name="facet_counts">
        <lst name="facet_fields">
            <lst name="professions_raw_nl">
                <int name="Pharmacy">2724</int>
                <int name="Physiotherapy">2474</int>
                <int name="Doctor">2246</int>
                <int name="Dentist">1309</int>
            </lst>  
        </lst>
    </lst>
</response> 

期望输出
牙医 (1309)
医生 (2246)
药房 (2724)
物理治疗 (2474)

当前的 ASP.NET 代码

dim node as XmlNode = objXML.SelectSingleNode("response/lst[@name=""facet_counts""]/lst[@name=""facet_fields""]/lst[@name=""professions_raw_nl""]")
Dim sbuilder As New StringBuilder
Dim navigator As XPathNavigator = node.CreateNavigator()
Dim selectExpression As XPathExpression = navigator.Compile("???") <-- what expression should I use here ???
selectExpression.AddSort("????", XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Text) <-- what expression should I use here ????
Dim nodeIterator As XPathNodeIterator = navigator.Select(selectExpression)
While nodeIterator.MoveNext()
    'how can I print the name and value of the node?
End While
4

3 回答 3

0

如果您使用的是 .Net>=3.5,那么您可以像这样使用 linq 为您执行此操作

var xmlString = "YOUR XML STRING";
var doc = XDocument.Parse(xmlString);

var list = doc. Descendants("int").select(n=>new {Name = n.Attribute("name").Value, Value = n.Value});
var sortedList = list.OrderBy(l=>l.Name);

编辑不是 VB 中的专业人士,但试试这个 - 请在这里可能存在语法错误

dim xmlString as string
xmlString = "YOUR XML STRING"
dim doc as XDocument()
doc = XDocument.Parse(xmlString)
dim list = doc.Descendants("int").select(n=>new {Name = n.Attribute("name").Value, Value = n.Value}).OrderBy(l=>l.Name)

LINQ 代表语言集成查询。它比您当前使用的东西更容易和统一。您可以在此处阅读更多信息

于 2012-10-17T21:31:48.760 回答
0

我尝试了以下代码并且它正在工作(C#)您可以获得如下值

        var doc = new XmlDocument();
        doc.Load("c:\\users\\ozgur\\sample.xml");
        var nav = doc.CreateNavigator();
        var node = nav.SelectSingleNode("response").SelectSingleNode("lst[@name=\"facet_counts\"]").SelectSingleNode("lst[@name=\"facet_fields\"]").SelectSingleNode("lst[@name=\"professions_raw_nl\"]").Select("int");

        var sorted = new SortedDictionary<string, string>();
        while (node.MoveNext())
        {
            var name = node.Current.SelectSingleNode("@name").Value;
            var value = node.Current.Value;
            sorted.Add(name, value);
        }

        foreach (var item in sorted)
        {
            item.Key.ToString();
            item.Value.ToString();
        }
于 2012-10-17T21:41:37.917 回答
0

由于所有答案似乎都适用于 Linq,而我只想使用常规 VB.NET,因此我现在将每个节点添加到 Arraylist 中,并在其上使用常规 Array.Sort()。行得通。

于 2012-10-23T11:29:38.727 回答