Code Snippet: Sort nodes in an Xml Document

Posted at: 7/13/2007 at 4:40 PM by saravana

Scenario: Need to produce a new xml document with particular node list sorted in ascending/descending order

Code:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"Input.xml");

XmlDocument xmlDocCopy = new XmlDocument();
xmlDocCopy.LoadXml(xmlDoc.OuterXml);
xmlDocCopy.SelectSingleNode("//Links").RemoveAll();

XmlNode node = xmlDoc.SelectSingleNode("//Links");
XPathNavigator navigator = node.CreateNavigator();
XPathExpression selectExpression = navigator.Compile("Link/Title");
selectExpression.AddSort(".", XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Text);
XPathNodeIterator nodeIterator = navigator.Select(selectExpression);
while (nodeIterator.MoveNext())
{
    XmlNode linkNode = xmlDoc.SelectSingleNode("//Link[Title=\"" + nodeIterator.Current.Value + "\"]");
    XmlNode importedLinkNode = xmlDocCopy.ImportNode(linkNode, true);
    xmlDocCopy.SelectSingleNode("//Links").AppendChild(importedLinkNode);
}

xmlDocCopy.Save(@"Output.xml");

Input:

<Section>
    <Links>
        <Link Id="1">
            <Title>Jupiter Line</Title>
            <AddedDate>27/05/2007</AddedDate>
        </Link>
        <Link Id="2">
            <Title>Alfa Line</Title>
            <AddedDate>27/05/2007</AddedDate>
        </Link>
        <Link Id="3">
            <Title>Zebra Line</Title>
            <AddedDate>27/05/2007</AddedDate>
        </Link>
        <Link Id="4">
            <Title>Copper Line</Title>
            <AddedDate>27/05/2007</AddedDate>
        </Link>
    </Links>
</Section>

Output:

<Section>
  <Links>
    <Link Id="2">
      <Title>Alfa Line</Title>
      <AddedDate>27/05/2007</AddedDate>
    </Link>
    <Link Id="4">
      <Title>Copper Line</Title>
      <AddedDate>27/05/2007</AddedDate>
    </Link>
    <Link Id="1">
      <Title>Jupiter Line</Title>
      <AddedDate>27/05/2007</AddedDate>
    </Link>
    <Link Id="3">
      <Title>Zebra Line</Title>
      <AddedDate>27/05/2007</AddedDate>
    </Link>
  </Links>
</Section>

Tags:  Categories: .NET
Actions: Email this article Email | Kick it! | DZone it! | Save to del.icio.us | Technorati Links
Post Information: Permanent LinkPermalink | CommentsComments(4) | Comments RSS

Comments

Friday, July 27, 2007 4:16 PM
elgoYa
For order by attribute using @nameattribute.

Example:

selectExpression.AddSort("@order", XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Number);
Thursday, August 02, 2007 9:29 PM
Anonymous
Anonymous
Good approach.  But this may fail if you have two nodes with Same title.  The above method works only for nodes with distinct Titles.

-Sai
Tuesday, August 07, 2007 1:10 PM
Anonymous
Anonymous
while (myNodeIterator.MoveNext())
            {
            XmlNode  newNode = ((IHasXmlNode)myNodeIterator.Current).GetNode().ParentNode   ;
            myXmlNode.AppendChild(newNode);
            }
            myXmlDoc.Save("filename.xml");


Another way to sort and update  xml file.
Wednesday, February 20, 2008 9:49 AM
AsWaM
Nice but a bit complicated in my opinion Wink
What about a mapping with inline XSLT script?

(xsl:for-each select="Order")
(xsl:sort select="Date" data-type="text" order="ascending"/)
(xsl:copy-of select="." /)
(/xsl:for-each)


I use it often and it is fine.

Of course replace brackets with greater than sign....

Add comment




  Country flag

biuquote
  • Comment
  • Preview
Loading