2016-05-27 20 views
0

Ich habe ein XML-Dokument vom Typ System.Xml.XmlDocument wie folgend:Wie sortiert man untergeordnete Elemente eines Elements in XmlDocument in C#?

<root> 

    <group> 
    <dog order="1" /> 
    <cat order="4" /> 
    <cat order="3" /> 
    <dog order="7" /> 
    <dog order="5" /> 
    <cat order="6" /> 
    <dog order="2" /> 
    </group> 

    <other/> 

</root> 

ich es wie

<root> 

    <group> 
    <dog order="1" /> 
    <dog order="2" /> 
    <cat order="3" /> 
    <cat order="4" /> 
    <dog order="5" /> 
    <cat order="6" /> 
    <dog order="7" /> 
    </group> 

    <other/> 

</root> 

ich verschiedene Codes online, aber keiner von ihnen versucht haben zu wollen, ist für mich arbeiten. Ich habe auch mein XmlDocument in XDocument konvertiert, um mit LINQ wie folgt zu arbeiten:

var xDoc = XDocument.Parse(xdoc.OuterXml); 

noch immer kein Erfolg.

Ich brauche

Antwort

1

Eine Möglichkeit, die Elemente zu entfernen und fügen Sie sie nach dem Sortieren erneut hinzu.

XDocument doc = XDocument.Load(filename); 
var elements = doc.Root.Element("group").Elements().ToList(); // Copy the elements. 

doc.Root.Element("group").RemoveAll();       // Remove the elements from the document. 
doc.Root.Element("group").Add(elements.OrderBy(x=>int.Parse(x.Attribute("order").Value))); 
//Add them again after sorting. 

prüfen diese Demo

Ausgabe

<root> 
    <group> 
    <dog order="1" /> 
    <dog order="2" /> 
    <cat order="3" /> 
    <cat order="4" /> 
    <dog order="5" /> 
    <cat order="6" /> 
    <dog order="7" /> 
    </group> 
</root> 
+0

Sein großer Bruder. Demo scheint perfekt zu funktionieren. Ich werde diesen Code verwenden. Sobald alles eingerichtet ist, werde ich diese Antwort markieren. Schätzen Sie Ihre Antwort. –

1

dieses XSLT versuchen Kinder innerhalb Gruppenelement XmlDocument sortieren: -

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/*"> 
     <xsl:copy> 
      <xsl:for-each select="dog"> 
          <xsl:sort select="@aa" order="ascending"/> 
        <xsl:copy-of select="."/> 
      </xsl:for-each> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

und dann gilt es ::

XPathDocument myDocXPath = new XPathDocument(myXml); 
XslTransform myXslTrans = new XslTransform(); 
myXslTrans.Load(myStyleSheet); 
XmlTextWriter myWriter = new XmlTextWriter("result.xml",null); 
myXslTrans.Transform(myDocXPath, null, myWriter); 
+0

Ich schätze Sie reagiert. Aber ich habe wirklich keine Ahnung, was dieser Code machen würde? Ich habe dieses xml in xDoc und ich möchte nur das Gruppenelement darin sortieren und es zu xDoc zurückstellen. –

+0

Anwendung von XSLT sollte Sie sortieren xml und dann müssen Sie es schreiben einige andere XML (das wird sortiert) – DDave

+0

Was ist, wenn ich result.xml nicht schreiben möchte? –