Sort XML nodes alphabetically on attribute name

I have an XML document for which I want to sort specific nodes alphabetically.

XML document

<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>

Desired output
Dentist (1309)
Doctor (2246)
Pharmacy (2724)
Physiotherapy (2474)

Current ASP.NET code

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

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

if you are using .Net>=3.5 then you can use linq to do this for you like this

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);

EDIT not a pro in VB but try this – pls there may be syntactical errors in here

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 stands for Language Integrated Query.. and is a lot easier and Uniform that the thing you are using currently.. you can read more here

Method 2

I tried the following code and it is working (C#) you can get values as below

        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();
        }

Method 3

Since all answers seem to work with Linq and I just wanted to use regular VB.NET I now added each node in an Arraylist and used the regular Array.Sort() on it.
Does the trick.


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x