2016-05-27 14 views
0

Я в XML-документ типа System.Xml.XmlDocument следующим образом:Как сортировать дочерние элементы элемента в XmlDocument в 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> 

Я хочу, чтобы это было как

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

Я пробовал различные коды в Интернете, но ни один из них не является работая для меня. Я также преобразовал свой XmlDocument в XDocument для работы с LINQ следующим образом:

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

еще не успел.

Мне нужно сортировать детей внутри группы элементов XmlDocument

ответ

1

Один из вариантов заключается в удалении элементов и добавьте их снова после сортировки.

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. 

Проверить это Demo

Выход

<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

Его большой брат. Демонстрация, похоже, работает идеально. Я буду использовать этот код. Как только все настроено, я помечаю этот ответ. Цените свой ответ. –

1

попробовать этот XSLT: -

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

, а затем применить его ::

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

Я ценю, что вы ответили. Но я действительно не знаю, что будет делать этот кусок кода? Я получил этот xml в xDoc, и я просто хочу отсортировать элемент группы внутри него и вернуть его в xDoc. –

+0

Применение XSLT должно сортировать вас по xml, а затем вам нужно написать ему другой XML (это будет отсортировано) – DDave

+0

Что делать, если я не хочу писать result.xml? –

Смежные вопросы