如何将节点放入父节点?

Posted

技术标签:

【中文标题】如何将节点放入父节点?【英文标题】:How to put nodes into parent node? 【发布时间】:2020-05-31 14:32:17 【问题描述】:

我想添加一个带有属性的父节点并将节点放在这个父节点内。我有以下 xml:

<?xml version="1.0" encoding="UTF-8"?>
<foo>
   <row>
      <PHONE_NUM>124</PHONE_NUM>
      <PHONE_ORDER>1</PHONE_ORDER>      
   </row>
   <row>
      <PHONE_NUM>123</PHONE_NUM>
      <PHONE_ORDER>2</PHONE_ORDER>      
   </row>
   <row>
      <PHONE_NUM>181</PHONE_NUM>
      <PHONE_ORDER>3</PHONE_ORDER>      
   </row>   
</foo>

我试过这种方法:

var xmlString = @"<?xml version=""1.0"" encoding=""UTF-8""?>
    <foo>
       <row>
          <PHONE_NUM>124</PHONE_NUM>
          <PHONE_ORDER>1</PHONE_ORDER>      
       </row>
       <row>
          <PHONE_NUM>123</PHONE_NUM>
          <PHONE_ORDER>2</PHONE_ORDER>      
       </row>
       <row>
          <PHONE_NUM>181</PHONE_NUM>
          <PHONE_ORDER>3</PHONE_ORDER>      
       </row>   
    </foo>";

var report = XDocument.Parse(xmlString);
var newdoc = new XDocument();
newdoc.Add(new XElement("testsuites")); 
newdoc.Root.Add(report.Root);

但是上面的代码生成的是没有id,并且命令books已经变成了一个根:

<books>
  <foo>
      <row>
          <PHONE_NUM>124</PHONE_NUM> 
          <PHONE_ORDER>1</PHONE_ORDER> 
      </row>
      <row>
          <PHONE_NUM>123</PHONE_NUM> 
          <PHONE_ORDER>2</PHONE_ORDER> 
      </row>
      <row>
          <PHONE_NUM>181</PHONE_NUM> 
          <PHONE_ORDER>3</PHONE_ORDER> 
      </row>
      </foo>
  </books>

我想要实现的是:

<?xml version=""1.0"" encoding=""UTF-8""?>
<foo>
    <books id=""1"">
       <row>
          <PHONE_NUM>124</PHONE_NUM>
          <PHONE_ORDER>1</PHONE_ORDER>      
       </row>
       <row>
          <PHONE_NUM>123</PHONE_NUM>
          <PHONE_ORDER>2</PHONE_ORDER>      
       </row>
       <row>
          <PHONE_NUM>181</PHONE_NUM>
          <PHONE_ORDER>3</PHONE_ORDER>      
       </row>  
    </books>
</foo>

如果可能的话,最好使用XmlDocument 类。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

此过程可帮助您创建一个新子节点并将所有节点移动到该新子节点下。

    先创建一个新元素.. 移动这个新元素下的所有节点 在 XML 中您需要的位置添加新元素。
XmlDocument doc2 = new XmlDocument();
doc2.LoadXml(xmlString);

var newElement = doc2.CreateElement("body");
newElement.SetAttribute("id", "1");

var moveNodes = doc2.DocumentElement.SelectNodes("//row");
foreach(XmlNode node in moveNodes)
    newElement.AppendChild(node);

doc2.GetElementsByTagName("foo")[0].AppendChild(newElement);

输出

<?xml version="1.0" encoding="UTF-8"?>
<foo>
    <body id="1">
        <row>
            <PHONE_NUM>124</PHONE_NUM>
            <PHONE_ORDER>1</PHONE_ORDER>
        </row>
        <row>
            <PHONE_NUM>123</PHONE_NUM>
            <PHONE_ORDER>2</PHONE_ORDER>
        </row>
        <row>
            <PHONE_NUM>181</PHONE_NUM>
            <PHONE_ORDER>3</PHONE_ORDER>
        </row>
    </body>
</foo>

【讨论】:

【参考方案2】:

这里是关于你想要做什么,使用XDocument 类。只需根据您的规范创建新节点并修改现有节点即可:

var report = XDocument.Parse(xmlString);
report.Root.Name = XName.Get("books", report.Root.Name.NamespaceName);
report.Root.Add(new XAttribute("id", 1));
var newDoc = new XDocument();
var newRoot = new XElement("foo");
newRoot.Add(report.Root);
newDoc.Add(newRoot);

【讨论】:

以上是关于如何将节点放入父节点?的主要内容,如果未能解决你的问题,请参考以下文章

VirtualStringTree - 如何使节点完全没有父节点

如何使用xsl根据属性将xml的兄弟节点更改为父节点和子节点

如何将XML子节点添加到父节点c#

在nodejs中管道从子节点到父节点的数据

遍历 YAML::Node 时如何获取当前节点的父节点?

如何将两个父节点连接到一个子节点以及如何务实地为树中的每个节点制作工具提示?在 D3 js (SVG) 中