如何对文件中的 xml 节点进行排序?

How can I sort the xml nodes in a file?

提问人:BlackDevOps 提问时间:12/29/2022 最后编辑:anastaciuBlackDevOps 更新时间:12/30/2022 访问量:128

问:

我有一个XML文件,我想在其中按字母顺序对节点进行排序并将它们写回该文件。原始文件如下所示:Object

<?xml version="1.0" encoding="utf-8"?>
<Package>
  <Objects>
    <Object Type="Package">moB</Object>
    <Object Type="Package">moA</Object>
    <Object Type="Package">moC</Object>
  </Objects>
</Package>

预期输出应为:

<?xml version="1.0" encoding="utf-8"?>
<Package>
  <Objects>
    <Object Type="Package">moA</Object>
    <Object Type="Package">moB</Object>
    <Object Type="Package">moC</Object>
  </Objects>
</Package>

我想用 LINQ 解决这个问题,不幸的是,我无法让查询将节点读取为集合以进行进一步处理。Object

var xdoc = XDocument.Load(inputFile);
var orderedList = xdoc.Root.Element("Objects");
C# XML LINQ IO

评论

0赞 JohnLBevan 12/29/2022
目前,您正在获取单个节点,而不是多个节点。请尝试ObjectsObjectxdoc.DocumentElement.SelectNodes("/Package/Objects/Object");

答:

1赞 Raziak 12/29/2022 #1

尝试使用此行,以选择 Objects 元素并对它们进行排序:

var orderedList = xdoc.Root.Element("Objects")
                      .Elements("Object")
                      .OrderBy(e => e.Value);

然后,您应该创建一个新的 xElement 来保存排序后的对象元素,并将原始版本替换为排序后的版本,然后保存修改后的文档!

评论

0赞 BlackDevOps 12/30/2022
非常感谢。现在很清楚如何导航到 xml 节点。但是我有以下错误..System.NullReferenceException:“对象引用未设置为对象的实例。System.Xml.Linq.XContainer.Element(...) 返回零。根对象正常。
2赞 anastaciu 12/29/2022 #2

我想用 LINQ 解决这个问题,不幸的是,我无法让查询将 Object 节点读取为集合以进行进一步处理。

你只读取根节点,这将给出一个对象而不是一个集合,你需要读取所有内部节点:ObjectsXElementObject

var objectList = xdoc.Root.Element("Objects").Elements("Object");

结果是您可以使用 LINQ 进行操作。IEnumerable<XElement>

我想按字母顺序对 Object 节点进行排序并将它们写回文件中。

当您拥有集合时,您可以按内部文本对其进行排序:Object

var orderedList = objectList.OrderBy(x => x.Value); 

并用有序的节点替换旧节点:Object

xdoc.Root.Element("Objects").ReplaceNodes(orderedList);

之后,只需将其保存回文件即可:

xdoc.Save(inputFile); // will replace the content

如果您想保留原始文件,只需将其保存到其他文件中:

xdoc.Save("someOtherFile.xml"); 

在这里,您可以运行所描述的程序,显示之前和之后的文件:

enter image description here

旁注:

请注意,在发布的 xml 内容中存在不可打印的字符,这些字符会破坏您的程序:

enter image description here

评论

0赞 BlackDevOps 12/30/2022
var xdoc = XDocument.Load(“测试.xml”);var objectList = xdoc。Root.Element(“对象”)。Elements(“对象”);我有以下错误。System.NullReferenceException: “对象引用未设置为对象的实例。
0赞 anastaciu 12/30/2022
@BlackDevOps,您必须在节点名称中有一些拼写错误,无论是在程序中,还是在文件本身中,我都发布了一个带有执行的 gif。请注意不可打印的字符,有时在复制/粘贴中,您将这些字符放在您显示的示例文件中。
1赞 BlackDevOps 12/30/2022
感谢您抽出宝贵时间为我举个例子来说明这一点。您的解决方案对解决我的问题有很大帮助。