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

时间:2011-10-28 15:50:19

标签: c# xml file

我有一个格式如下的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"> 

但我无法正确生成。

7 个答案:

答案 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.RootAdd添加元素。 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");

是您拥有的所需代码。