c# - 使用 c# Xdocument 类添加子节点

标签 c# xml

我有一个 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"));”,我收到一个错误:

“此操作会创建结构不正确的文档。”

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

最佳答案

您正在尝试将额外的 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 调用,这样您只有在保存时才会结束实际上对文档进行了更改。

关于c# - 使用 c# Xdocument 类添加子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17916788/

相关文章:

xml - Xpath最深节点,其字符串内容长于给定长度

Android 开关 - 在开/关时更改开关的背景

c# - 将实例转换为通用父级时出错

xml - 如何使 XML 模式中的元素可选?

Android:InflateException:二进制 XML 文件行:膨胀类 <unknown> 时出错

c# - 拥有具有 2 种数据类型的强类型数组的最简单方法?

xml - 使用 XMLMAP 从 SAS 写入分层 XML 文件

c# - 在 C# 中处理命令行选项的最佳方式

c# - 为什么派生 List<T> 类只是为了重申索引器?

c# - 当电脑和玩家碰撞时如何引入延迟?