在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"); 

是你需要的代码。