XmlDocument 重新排列 XmlNodes C#

XmlDocument rearrange XmlNodes C#

我有一个 XML 文档,用于存储有关系统用户的各种信息。最终,我感兴趣的节点在下面列出。

所以,有一个用户有很多用户内容 - 我仅以书籍为例。

<?xml version="1.0" encoding="UTF-8"?>
<user>
  <userProperties>
    <alias val="userAliasOne"/>
    <id val="3423423"/>
  </userProperties>
  <userContent>
    <userBooks>
      <genre>
        <book>
          <title>Dummy Value</title>
        </book>
      </genre>
    </userBooks>
  </userContent>
</user>

我需要以某种方式重组 XML,使用 XmlDocument 和 XmlNode,使其与下面的匹配。 (userBooks 成为根节点,但 userBooks 的所有内容 - /genre/book/title - 保留在 userContent 中)。

<?xml version="1.0" encoding="UTF-8"?>
<userBooks>
  <user>
    <userProperties>
      <alias val="userAliasOne"/>
      <id val="3423423"/>
    </userProperties>
    <userContent>
      <genre>
        <book>
          <title>Dummy Value</title>
        </book>
      </genre>
    </userContent>
  </user>
</userBooks>

我试过选择单个节点并克隆它们,然后将克隆附加到父节点并删除不再需要的子节点。它变得很长很复杂,我无法让它工作。一定有我不知道的更优雅的解决方案。

感谢任何帮助。

谢谢。

下面是添加新根元素的示例:

using System;
using System.Xml;

class Test
{
    static void Main()
    {
        XmlDocument doc = new XmlDocument();
        doc.Load("test.xml");
        var originalRoot = doc.DocumentElement;
        doc.RemoveChild(originalRoot);
        var newRoot = doc.CreateElement("userBooks");
        doc.AppendChild(newRoot);
        newRoot.AppendChild(originalRoot);
        doc.Save(Console.Out);
    }
}

尝试对 "removing" 原始 userBooks 元素使用相同的方法 - 从其父元素中删除该元素,然后添加所有子节点(userBooks)作为userBooks.

原始父节点的新子节点

使用 XML Linq

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {

            XDocument doc = XDocument.Load(FILENAME);
            List<XElement> userBooks = doc.Descendants("userBooks").ToList();

            foreach(XElement userBook in userBooks)
            {
                userBook.ReplaceWith(userBook.Element("genre"));
            }
        }
    }
}
​