2013-07-29 3 views
8

У меня есть xml-файл, как показано ниже.Добавление дочерних узлов с использованием класса C# Xdocument

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

    <file:Properties> 

</file:Situattion> 

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

кодекса в C# я попытался с помощью класса 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».

+0

Вы изучали использование 'XPATH' или' XQuery' также смотрите ссылку '-> Related', расположенную в правой части этой текущей страницы, много рабочих примеров для исследования – MethodMan

+1

@DJKRAZE: нет необходимости для использования XPath или XQuery здесь вообще, и я не верю, что они даже упростили бы код. –

ответ

11

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

Также обратите внимание, что Descendants() будет never return 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 вызов, так что вы будете только в конечном итоге сэкономить, если вы на самом деле внесли изменения в документ.

+0

Каков тип объекта «document».? – TVSuser1654136

+0

Получение ошибки «Символ«: », шестнадцатеричное значение 0x3A, не может быть включен в имя». – TVSuser1654136

+1

@ user1654136: 'doc' является' XDocument'. И если вы получаете эту ошибку, это предполагает, что вы используете '' file: Character "' как локальное имя вместо 'ns +" Character "' или что-то подобное. У вас не должно быть этой проблемы в коде, который я предоставил. –

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

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

Смежные вопросы