Добавление дочерних узлов с использованием класса С# 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")));
Примечание. Я не использовал пространство имен для краткости. Вы должны добавить их.