在C#中将元素添加到xml文件
我有一个格式如下的XML文件:
testcode1 testcode2 ...
我可以使用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);
结果如下:
name goes here code goes here
它工作正常,但名称标签生成不正确。 它应该是
但我无法正确生成。
你很接近,但是你希望name是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(@" testcode1 testcode2 "); xdoc.Root.Add( new XElement("Snippet", new XAttribute("name", "name goes here"), new XElement("SnippetCode", "SnippetCode")) ); xdoc.Save(@"C:\TEMP\FOO.XML"); }
这会生成输出:
testcode1 testcode2 SnippetCode
如果要添加属性而不是元素,则必须这样说:
XElement root = new XElement("Snippet"); root.Add(new XAttribute("name", "name goes here")); root.Add(new XElement("SnippetCode", "SnippetCode"));
上面的代码生成以下XML元素:
SnippetCode
我倾向于创建与结构匹配的类并向集合添加实例,然后序列化和反序列化集合以加载和保存文档。
我用过XDocument.Root 。 添加以添加元素。 Root返回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"
来选择要使用的parentElement.GetNamespaceOfPrefix("namespacePrefixThatGoesWithColon")+"Snippet"
var child = new XElement(parentElement.GetNamespaceOfPrefix("namespacePrefixThatGoesWithColon")+"Snippet", new XAttribute("Attr1", "42"), new XAttribute("Attr2", "22"));
name是属性,而不是元素。 这就是它失败的原因。 研究在
元素上使用SetAttribute。
root.SetAttribute("name", "name goes here");
是你需要的代码。