简体   繁体   English

使用c#Xdocument类添加子节点

[英]Adding child nodes using c# Xdocument class

I have an xml file as given below. 我有一个xml文件,如下所示。

<?xml version="1.0" encoding="utf-8"?>
 <file:Situattion xmlns:file="test">

  <file:Properties>

</file:Situattion>

I would like to add the child element file:Character using xDocument.So that my final xml would be like given below 我想添加子元素文件:使用xDocument.So的字符,我的最终xml将如下所示

<?xml version="1.0" encoding="utf-8"?>
  <file:Situattion xmlns:file="test">

   <file:Characters>

     <file:Character file:ID="File0">
     <file:Value>value0</file:Value>
     <file:Description>
      Description0 
     </file:Description>
     </file:Character>

 <file:Character file:ID="File1">
     <file:Value>value1</file:Value>
     <file:Description>
     Description1
     </file:Description>
     </file:Character>

     </file:Characters>

Code in c# i tried using Xdocument class is given below. 下面给出了使用Xdocument类尝试的c#中的代码。

        XNamespace ns = "test";
        Document = XDocument.Load(Folderpath + "\\File.test");

        if (Document.Descendants(ns + "Characters") != null)
        {

            Document.Add(new XElement(ns + "Character"));
        }
        Document.Save(Folderpath + "\\File.test");

At line " Document.Add(new XElement(ns + "Character")); ", I am getting an error: 在行“ Document.Add(new XElement(ns + "Character")); ”,我收到一个错误:

"This operation would create an incorrectly structured document." .

How can I add the node under " file:Characters ". 如何在“ file:Characters ”下添加节点。

You're trying to add an extra file:Character element directly into the root. 您正在尝试添加一个额外的file:Character元素直接添加到根目录中。 You don't want to do that - you want to add it under the file:Characters element, presumably. 你不想这样做 - 你想把它添加到file:Characters元素,大概是。

Also note that Descendants() will never return null - it will return an empty sequence if there are no matching elements. 另请注意, Descendants() 永远不会返回null - 如果没有匹配的元素,它将返回一个空序列。 So you want: 所以你要:

var ns = "test";
var file = Path.Combine(folderPath, "File.test");
var doc = XDocument.Load(file);
// Or var characters = document.Root.Element(ns + "Characters")
var characters = document.Descendants(ns + "Characters").FirstOrDefault();
if (characters != null)
{
    characters.Add(new XElement(ns + "Character");
    doc.Save(file);
}

Note that I've used more conventional naming, Path.Combine , and also moved the Save call so that you'll only end up saving if you've actually made a change to the document. 请注意,我使用了更常规的命名, Path.Combine ,并且还移动了Save调用,这样如果您实际对文档进行了更改,则最终只会保存。

    Document.Root.Element("Characters").Add(new XElement("Character", new XAttribute("ID", "File0"), new XElement("Value", "value0"), new XElement("Description")),
        new XElement("Character", new XAttribute("ID", "File1"), new XElement("Value", "value1"), new XElement("Description")));

Note: I have not included the namespace for brevity. 注意:为简洁起见,我没有包含命名空间。 You have to add those. 你必须添加这些。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM