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

ray*_*ran 34 c# xml file

我有一个格式如下的XML文件:

<Snippets>
  <Snippet name="abc">
    <SnippetCode>
      testcode1
    </SnippetCode>
  </Snippet>

  <Snippet name="xyz">
    <SnippetCode>      
     testcode2
    </SnippetCode>
  </Snippet>

  ...

</Snippets>
Run Code Online (Sandbox Code Playgroud)

我可以使用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);
Run Code Online (Sandbox Code Playgroud)

结果如下:

<Snippet>
    <name>name goes here</name>
    <SnippetCode>
    code goes here
    </SnippetCode>
</Snippet>
Run Code Online (Sandbox Code Playgroud)

它工作正常,但名称标签生成不正确.它应该是

<Snippet name="abc"> 
Run Code Online (Sandbox Code Playgroud)

但我无法正确生成.

Jim*_*ley 61

你很亲密,但你希望名字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); 
Run Code Online (Sandbox Code Playgroud)


Joh*_*hnD 7

你需要创建一个新的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");
}
Run Code Online (Sandbox Code Playgroud)

这会生成输出:

<?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>
Run Code Online (Sandbox Code Playgroud)


svi*_*ick 5

如果要添加属性而不是元素,则必须这样说:

XElement root = new XElement("Snippet");
root.Add(new XAttribute("name", "name goes here"));
root.Add(new XElement("SnippetCode", "SnippetCode"));
Run Code Online (Sandbox Code Playgroud)

上面的代码生成以下XML元素:

<Snippet name="name goes here">
  <SnippetCode>SnippetCode</SnippetCode>
</Snippet> 
Run Code Online (Sandbox Code Playgroud)