在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">
但我无法正确生成。
您很接近,但您希望名称是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");
是您所需的代码。