Добавление дочерних узлов с использованием класса С# Xdocument

У меня есть xml файл, как показано ниже.

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

  <file:Properties>

</file:Situattion>

Я хотел бы добавить файл дочерних элементов: Character, используя 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>

Код в С# i, который я попробовал, используя класс Xdocument, приведен ниже.

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

В строке " Document.Add(new XElement(ns + "Character")); ", я получаю сообщение об ошибке:

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

Как добавить узел под " file:Characters ".

Ответы

Ответ 1

Вы пытаетесь добавить дополнительный file:Character элемент непосредственно в корневой каталог. Вы не хотите этого делать - вы хотите добавить его под file:Characters Элемент file:Characters, предположительно.

Также обратите внимание, что Descendants() никогда не вернет null - он вернет пустую последовательность, если нет соответствующих элементов. Итак, вы хотите:

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);
}

Обратите внимание, что я использовал более традиционное имя, Path.Combine, а также переместил вызов Save чтобы вы только закончили сохранение, если вы действительно внесли изменения в документ.

Ответ 2

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

Примечание. Я не использовал пространство имен для краткости. Вы должны добавить их.