XmlDocument重新排列XmlNodes C#

时间:2015-12-11 16:18:23

标签: c# xml xmldocument xmlnode

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

我尝试选择单个节点并克隆它们,然后将克隆附加到父节点并删除不再需要的子节点。它变得非常漫长而令人费解,我无法让它发挥作用。必须有一个我不了解的更优雅的解决方案。

任何帮助表示赞赏。

感谢。

2 个答案:

答案 0 :(得分:0)

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

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);
    }
}

尝试使用相同的方法“删除”原始中的userBooks元素 - 从父项中删除元素,然后将所有子节点(userBooks)添加为新的子节点userBooks的原始父母。

答案 1 :(得分:0)

使用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"));
            }
        }
    }
}
​