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

标签 c# xml linq io

我有一个 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");

最佳答案

I want to solve this with LINQ, unfortunately I can't get the query to read the Object nodes as a collection for further processing.

您仅读取根节点Objects ,这将给出 XElement对象而不是集合,您需要读取所有内部 Object节点:

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

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

I want to sort the Object nodes alphabetically and write them back to the file.

当您拥有 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

关于c# - 如何对文件中的 xml 节点进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74950203/

相关文章:

c# - 如何从 WinForms 中的文本框移除焦点?

c# - 按两个标准 C# 对列表进行分组

android - EditText 自动到最新的字符?

c# - 以编程方式在 c# 中添加 [XmlIgnore] 属性以进行序列化

c# - 在键级别合并字典,然后在值级别合并字典

c# - 如何拆分多个级别的成员访问权限

c# - ViewModel 中的 MVC3 集合或从 Ajax 服务填充

c# - 如何使用 Regex 将十进制值中的句点转换为对 URL 更友好的新闻报道

java - xerces 认为具有 namespace 前缀的子元素无效

c# - 具有多个 group by 列的 linq 语句不允许 thenby