12

我有一个 xml 文件,如下所示。

<?xml version="1.0" encoding="utf-8"?>
 <file:Situattion xmlns:file="test">

  <file:Properties>

</file:Situattion>

我想添加子元素文件:使用 xDocument 的字符。所以我的最终 xml 如下所示

<?xml version="1.0" encoding="utf-8"?>
  <file:Situattion xmlns:file="test">

   <file:Characters>

     <file:Character file:ID="File0">
     <file:Value>value0</file:Value>
     <file:Description>
      Description0 
     </file:Description>
     </file:Character>

 <file:Character file:ID="File1">
     <file:Value>value1</file:Value>
     <file:Description>
     Description1
     </file:Description>
     </file:Character>

     </file:Characters>

下面给出了我尝试使用 Xdocument 类的 c# 中的代码。

        XNamespace ns = "test";
        Document = XDocument.Load(Folderpath + "\\File.test");

        if (Document.Descendants(ns + "Characters") != null)
        {

            Document.Add(new XElement(ns + "Character"));
        }
        Document.Save(Folderpath + "\\File.test");

在“ Document.Add(new XElement(ns + "Character"));”行,我收到一个错误:

"This operation would create an incorrectly structured document.".

如何在“ file:Characters”下添加节点。

4

2 回答 2

22

您正在尝试将额外的file:Character元素直接添加到根目录中。您不想这样做 - 您想将它添加到file:Characters元素下,大概。

另请注意,它Descendants()永远不会返回 null - 如果没有匹配的元素,它将返回一个空序列。所以你要:

var ns = "test";
var file = Path.Combine(folderPath, "File.test");
var doc = XDocument.Load(file);
// Or var characters = document.Root.Element(ns + "Characters")
var characters = document.Descendants(ns + "Characters").FirstOrDefault();
if (characters != null)
{
    characters.Add(new XElement(ns + "Character");
    doc.Save(file);
}

请注意,我使用了更传统的命名,Path.Combine,并且还移动了Save调用,以便只有在您实际对文档进行了更改时才能最终保存。

于 2013-07-29T05:49:01.677 回答
8
    Document.Root.Element("Characters").Add(new XElement("Character", new XAttribute("ID", "File0"), new XElement("Value", "value0"), new XElement("Description")),
        new XElement("Character", new XAttribute("ID", "File1"), new XElement("Value", "value1"), new XElement("Description")));

注意:为简洁起见,我没有包含命名空间。你必须添加这些。

于 2013-07-29T06:06:49.057 回答