2013-07-29 13 views
8

Tôi có tệp xml như được đưa ra bên dưới.Thêm các nút con bằng cách sử dụng lớp C# Xdocument

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

    <file:Properties> 

</file:Situattion> 

Tôi muốn thêm các tập tin phần tử con: nhân vật sử dụng xDocument.So rằng xml cuối cùng của tôi sẽ như thế nào đưa ra dưới đây

<?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> 

Mã trong C# tôi đã cố gắng sử dụng lớp XDocument được đưa ra dưới đây.

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

Tại dòng "Document.Add(new XElement(ns + "Character"));", tôi nhận được một lỗi:

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

Làm cách nào để thêm nút trong "file:Characters".

+0

bạn đã xem xét sử dụng 'XPATH' hoặc' XQuery' cũng nhìn vào liên kết '-> Related' nằm ở bên phải của trang hiện tại này, rất nhiều ví dụ làm việc để bạn điều tra – MethodMan

+1

@DJKRAZE: Không cần để sử dụng XPath hoặc XQuery ở đây, và tôi không tin họ thậm chí còn làm cho mã đơn giản hơn. –

Trả lời

11

Bạn đang cố thêm thêm file:Character phần tử trực tiếp vào thư mục gốc. Bạn không muốn làm điều đó - bạn muốn thêm nó dưới phần tử file:Characters, có lẽ.

Cũng lưu ý rằng Descendants() sẽ không bao giờ trả lại null - nó sẽ trả về một chuỗi trống nếu không có yếu tố phù hợp. Vì vậy, bạn muốn:

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

Lưu ý rằng tôi đã sử dụng nhiều cách đặt tên thông thường, Path.Combine, và cũng có thể di chuyển Save cuộc gọi để bạn sẽ chỉ kết thúc tiết kiệm nếu bạn đã thực sự thực hiện một sự thay đổi tài liệu.

+0

Loại đối tượng "tài liệu" là gì? – TVSuser1654136

+0

gặp lỗi "Ký tự ':', giá trị thập lục phân 0x3A, không được bao gồm trong tên." – TVSuser1654136

+1

@ user1654136: 'doc' là' XDocument'. Và nếu bạn nhận được lỗi đó, điều đó gợi ý bạn đang sử dụng '" file: Character "' làm tên cục bộ thay vì 'ns +" Character "', hoặc một cái gì đó tương tự. Bạn không nên có vấn đề đó trong mã tôi đã cung cấp. –

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

Lưu ý: Tôi chưa bao gồm không gian tên cho ngắn gọn. Bạn phải thêm chúng.