我有一个格式如下的XML文件:
<Snippets>
<Snippet name="abc">
<SnippetCode>
testcode1
</SnippetCode>
</Snippet>
<Snippet name="xyz">
<SnippetCode>
testcode2
</SnippetCode>
</Snippet>
...
</Snippets>
我可以使用XDocument成功加载元素,但是我在添加新元素时遇到了问题(有许多函数,我尝试过的大多数函数对我来说效果不好)。怎么做?新元素将包含代码段名称标记和代码段代码标记。我以前的方法是打开文件,并使用字符串手动创建元素虽然有效,但这是一个非常糟糕的主意。
我尝试过:
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">
但我无法正确生成。
答案 0 :(得分:57)
您已离婚,但您希望姓名为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);
答案 1 :(得分:6)
您需要创建一个新的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>
答案 2 :(得分:5)
如果要添加属性而不是元素,则必须这样说:
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>
答案 3 :(得分:4)
我倾向于创建与结构匹配的类,并将一个实例添加到集合中,然后序列化和反序列化集合以加载和保存文档。
答案 4 :(得分:2)
我已使用XDocument.Root。Add添加元素。 Root返回XElement,它具有附加XElements的Add函数
答案 5 :(得分:1)
这是上面答案的扩展,如果您的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"
来选择要使用的名称空间
e.g
var child = new XElement(parentElement.GetNamespaceOfPrefix("namespacePrefixThatGoesWithColon")+"Snippet", new XAttribute("Attr1", "42"), new XAttribute("Attr2", "22"));
答案 6 :(得分:0)
<Snippet name="abc">
name是属性,而不是元素。这就是它失败的原因。查看在<Snippet>
元素上使用SetAttribute。
root.SetAttribute("name", "name goes here");
是您拥有的所需代码。