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

Posted

技术标签:

【中文标题】如何将XML子节点添加到父节点c#【英文标题】:How to add XML child nodes to parent node c# 【发布时间】:2020-08-25 03:22:13 【问题描述】:

我当前的 xml 文件如下所示:

 <?xml version="1.0" encoding=""?>
<sheet1>


  <rd>
    <id>45</id>
    <name>alex</name>
    <last>chali</last>
    <phone>33666998565</phone>
    <refF>
      <adresse>41301 US Hwy 280, Sylacauga AL 35150</adresse>
      <citie>NY</citie>
    </refF>
    <age>30</age>
    <mp>
      <degree>2</degree>
    </mp>
    <dpa>1</dpa>
  </rd>
  <rd>
    <id>89</id>
    <name>anna</name>
    <last>marie</last>
    <phone>336465798465</phone>
    <refF>
      <adresse>30 Memorial Drive, Avon MA 2322</adresse>
      <citie>LA</citie>
    </refF>
    <age>28</age>
    <mp>
      <degree>2</degree>
    </mp>
    <dpa>1</dpa>
  </rd>

</sheet1>

在找什么:

<?xml version="1.0" encoding=""?>
<sheet1>

**<table>  // i want that contain all table rows**

  <rd>
    <id>45</id>
    <name>alex</name>
    <last>chali</last>
    <phone>33666998565</phone>
    <refF>
      <adresse>41301 US Hwy 280, Sylacauga AL 35150</adresse>
      <citie>NY</citie>
    </refF>
    <age>30</age>
    <mp>
      <degree>2</degree>
    </mp>
    <dpa>1</dpa>
  </rd>

  **</table>**
</sheet1>

这是我的代码:

  string header = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><Sheet1></Sheet1>";
            XDocument doc = XDocument.Parse(header);
            XElement sheet1 = doc.Root;

            foreach (DataRow row in dt.AsEnumerable())
            
                XElement rd = new XElement("rd", new object[] 
                    new XElement("id", row["id"]),
                    new XElement("name", row["name"]),
                    new XElement("last", row["last"]),
                    new XElement("phone", row["phone"]),
                    new XElement("refF", new object[] 
                        new XElement("adresse", row["adresse"]),
                        new XElement("citie", row["citie"]),
                    ),
                    new XElement("age", row["age"]),
                    new XElement("mp", new XElement("degree", row["mp"])),
                    new XElement("dpa", row["dpa"])
                );

                sheet1.Add(rd);
            

            doc.Save(FILENAME);

        

代码将“sheet1”显示为包含“rd”的根元素,但实际上我希望它作为“table.我应该如何重新构建它?注意,我只能使用 xDocument 而不是 xmlDocument

【问题讨论】:

From : To :
我想知道你是否要问这个问题。如果你想要 Sheet1 和 table 然后
Then XElement table = doc.Descendants("table").First();最后将行添加到表 From : sheet1.Add(rd); To : table.Add(rd);
是的,这就是我现在正在寻找的东西,我的问题是保存按钮 您已经有了保存方法。因此,如果您在全局空间中声明 doc,您只需在按钮单击中执行 doc.Save(FILENAME)。 现在我希望按钮显示保存对话框并选择保存 xml 文件的路径 见docs.microsoft.com/en-us/dotnet/framework/winforms/controls/… 【参考方案1】:

1 - 您可以将table 标签添加到header,例如:

string header = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><Sheet1><table></table></Sheet1>";

2 - 获取Root,而不是获取table 元素,例如:

XDocument doc = XDocument.Parse(header);
XElement table = doc.Root.Element("table");

结果

string header = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><Sheet1><table></table></Sheet1>";
XDocument doc = XDocument.Parse(header);
XElement table = doc.Root.Element("table");

foreach (DataRow row in dt.AsEnumerable())

    XElement rd = new XElement("rd", new object[] 
        new XElement("id", row["id"]),
        new XElement("name", row["name"]),
        new XElement("last", row["last"]),
        new XElement("phone", row["phone"]),
        new XElement("refF", new object[] 
            new XElement("adresse", row["adresse"]),
            new XElement("citie", row["citie"]),
        ),
        new XElement("age", row["age"]),
        new XElement("mp", new XElement("degree", row["mp"])),
        new XElement("dpa", row["dpa"])
    );

    table.Add(rd);

doc.Save(FILENAME);

希望对您有所帮助。

【讨论】:

非常感谢。这是一个很好的解决方案,而且效果很好。我还有一个小问题,你能帮我解决吗? @Uzarsef 不客气,我可以帮忙。向我解释有什么问题。 我想创建一个按钮来将数据从 datagridview 导出到这个 xml 文件,并且没有数据集,它只是一个从 excel 到数据表的表导入 @Uzarsef,不幸的是,我对 dataGridView 的操作了解不多,但我认为您搜索类似这样的内容:***.com/a/43055506/1745795,希望对您有所帮助。

以上是关于如何将XML子节点添加到父节点c#的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中将子节点添加到肥皂信封?

如何在不改变世界坐标中的相对位置、大小和比例的情况下将 SCNNode 作为子节点添加到父节点

VB.NET 如何将子节点添加到树视图中的特定节点

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

C#里treeview如何向指定NAME节点添加子节点?

如何在 C# 中获取 XML 的所有子节点