如何在 C# 中对 XmlDocument 中的元素的子元素进行排序?
How to sort children of an element in XmlDocument in C#?
我有一个 XML 类型 System.Xml.XmlDocument 的文档如下:
<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>
我在网上尝试了各种代码,但 none 对我有用。我还将我的 XmlDocument 转换为 XDocument 以使用 LINQ,如下所示:
var xDoc = XDocument.Parse(xdoc.OuterXml);
还是没有成功。
我需要对组元素 XmlDocument 中的子项进行排序
试试这个 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);
一种选择是删除元素并在排序后重新添加它们。
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>
我有一个 XML 类型 System.Xml.XmlDocument 的文档如下:
<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>
我在网上尝试了各种代码,但 none 对我有用。我还将我的 XmlDocument 转换为 XDocument 以使用 LINQ,如下所示:
var xDoc = XDocument.Parse(xdoc.OuterXml);
还是没有成功。
我需要对组元素 XmlDocument 中的子项进行排序
试试这个 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);
一种选择是删除元素并在排序后重新添加它们。
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>