在C#中向xml文件添加元素

本文关键字:添加 元素 文件 xml 中向 | 更新日期: 2023-09-27 18:12:36

我有一个格式如下的XML文件:

<Snippets>
  <Snippet name="abc">
    <SnippetCode>
      testcode1
    </SnippetCode>
  </Snippet>
  <Snippet name="xyz">
    <SnippetCode>      
     testcode2
    </SnippetCode>
  </Snippet>
  ...
</Snippets>

我可以使用XDocument成功地加载元素,但在添加新元素时遇到了困难(有很多函数,我尝试过的大多数函数都不适合我(。如何做到这一点?新元素将包含snippet name标记和snippet code标记。我以前的方法是打开文件,然后使用字符串手动创建元素,尽管这很有效,但这是一个非常糟糕的主意。

我尝试过的:

XDocument doc = XDocument.Load(spath);
XElement root = new XElement("Snippet");
root.Add(new XElement("name", "name goes here"));
root.Add(new XElement("SnippetCode", "SnippetCode"));
doc.Element("Snippets").Add(root);
doc.Save(spath);

结果是:

<Snippet>
    <name>name goes here</name>
    <SnippetCode>
    code goes here
    </SnippetCode>
</Snippet>

除了名称标记生成不正确之外,它运行良好。应该是

<Snippet name="abc"> 

但我无法正确生成。

在C#中向xml文件添加元素

您很接近,但您希望名称是XAttribute而不是XElement:

 XDocument doc = XDocument.Load(spath); 
 XElement root = new XElement("Snippet"); 
 root.Add(new XAttribute("name", "name goes here")); 
 root.Add(new XElement("SnippetCode", "SnippetCode")); 
 doc.Element("Snippets").Add(root); 
 doc.Save(spath); 

您需要创建一个新的XAttribute而不是XElement。试试这样的东西:

public static void Test()
{
    var xdoc = XDocument.Parse(@"
        <Snippets>
          <Snippet name='abc'>
            <SnippetCode>
              testcode1
            </SnippetCode>
          </Snippet>
          <Snippet name='xyz'>
            <SnippetCode>      
             testcode2
            </SnippetCode>
          </Snippet>
        </Snippets>");
    xdoc.Root.Add(
        new XElement("Snippet",
            new XAttribute("name", "name goes here"),
            new XElement("SnippetCode", "SnippetCode"))
    );
    xdoc.Save(@"C:'TEMP'FOO.XML");
}

这将生成输出:

<?xml version="1.0" encoding="utf-8"?>
<Snippets>
  <Snippet name="abc">
    <SnippetCode>
      testcode1
    </SnippetCode>
  </Snippet>
  <Snippet name="xyz">
    <SnippetCode>      
     testcode2
    </SnippetCode>
  </Snippet>
  <Snippet name="name goes here">
    <SnippetCode>SnippetCode</SnippetCode>
  </Snippet>
</Snippets>

如果你想添加一个属性,而不是元素,你必须这么说:

XElement root = new XElement("Snippet");
root.Add(new XAttribute("name", "name goes here"));
root.Add(new XElement("SnippetCode", "SnippetCode"));

上面的代码生成以下XML元素:

<Snippet name="name goes here">
  <SnippetCode>SnippetCode</SnippetCode>
</Snippet> 

我倾向于创建与结构匹配的类,并将实例添加到集合中,然后序列化和取消序列化集合以加载和保存文档。

我使用XDocument.Root.Add添加元素。Root返回XElement,该XElement具有用于附加XElements 的Add函数

这是上面答案的扩展,如果您的xml定义了名称空间(xmlns(,那么在添加子元素时会产生严重的副作用——xmlns = ""被添加到新的子元素中。

您想要做的(假设要添加的元素和其父元素属于同一个名称空间(是从父元素parentElement.GetDefaultNamespace()中获取名称空间。

var child = new XElement(parentElement.GetDefaultNamespace()+"Snippet", new XAttribute("Attr1", "42"), new XAttribute("Attr2", "22"));
child.Add(new XAttribute("Attr3", "777"));
parentElement.Add(child);

对于具有多个名称空间的父元素,可以通过将parentElement.GetDefaultNamespace()+"Snippet"更改为parentElement.GetNamespaceOfPrefix("namespacePrefixThatGoesWithColon")+"Snippet"来选择要使用的名称空间例如

var child = new XElement(parentElement.GetNamespaceOfPrefix("namespacePrefixThatGoesWithColon")+"Snippet", new XAttribute("Attr1", "42"), new XAttribute("Attr2", "22"));
<Snippet name="abc"> 

name是一个属性,而不是元素。这就是它失败的原因。研究在<Snippet>元素上使用SetAttribute。

root.SetAttribute("name", "name goes here");

是您所需的代码。