lunedì 18 giugno 2012

Ordinamento di un xml per attributo

In questo esempio riesco a farmi restituire un xml con il nodo "COMPANY/EMPLOYEE" ordinato per attributo "user".
<COMPANY>
 <EMPLOYEE user="1" d1="1" d2="" d3="3"/>
 <EMPLOYEE user="2" d1="3" d2="" d3="4"/>
 <EMPLOYEE user="3" d1="2" d2="" d3="14"/>
</COMPANY>

...
XmlNodeReader newReader = Utility.SortXml(oXmlDocument, "COMPANY", "COMPANY/NAME", "@user");
...
public static XmlNodeReader SortXml(XmlDocument oXmlSort, string rootXml, string nodeSort, string attrSort)
{
 try
 {
  XmlDocument myXmlNew = new XmlDocument();
  MemoryStream memStream = new MemoryStream();
  oXmlSort.Save(memStream);
  memStream.Position = 0;
  XmlDocument doc = new XmlDocument();
  doc.Load(memStream);
  XPathNavigator nav = doc.CreateNavigator();
  XPathExpression exp = nav.Compile(nodeSort);
  XPathExpression sortExpr = nav.Compile(attrSort);
  exp.AddSort(sortExpr, new IntegerComparer());
  XmlElement rootNode = myXmlNew.CreateElement(rootXml);
  myXmlNew.AppendChild(rootNode);
  XPathNodeIterator links = nav.Select(exp);
  while (links.MoveNext())
  {
   XmlNode xmlNode = ((System.Xml.IHasXmlNode)links.Current).GetNode();
   rootNode.AppendChild(myXmlNew.ImportNode(xmlNode, true));
  }
  XmlNodeReader noderReader = new XmlNodeReader(myXmlNew);
  return noderReader;
 }
 catch (Exception ex)
 {
  throw new Exception(ex.Message);
 }
}