2008-10-07 19 views
25

Tôi có một XmlDocument đã tồn tại và được đọc từ một tệp.Nối khối chuỗi XML vào XmlDocument hiện có

Tôi muốn thêm một đoạn Xml vào một nút trong tài liệu. Có cách nào tốt để tạo và thêm tất cả các nút mà không làm lộn xộn mã của tôi với nhiều lệnh .CreateNote và .AppendChild?

Tôi muốn một số cách tạo chuỗi hoặc chuỗiBuilder của phần Xml hợp lệ và chỉ thêm phần đó vào XmlNode.

ví dụ: gốc XMLdoc:

<MyXml> 
    <Employee> 
    </Employee> 
</MyXml> 

và, tôi muốn thêm một nhân khẩu học (với một số trẻ em) thẻ để nhân viên:

<MyXml> 
    <Employee> 
     <Demographic> 
     <Age/> 
     <DOB/> 
     </Demographic> 
    </Employee> 
</MyXml> 

Trả lời

71

tôi đề nghị sử dụng XmlDocument.CreateDocumentFragment nếu bạn có dữ liệu trong các chuỗi biểu mẫu tự do. Bạn vẫn sẽ phải sử dụng AppendChild để thêm phân đoạn vào một nút, nhưng bạn có quyền tự do xây dựng XML trong StringBuilder của mình.

XmlDocument xdoc = new XmlDocument(); 
xdoc.LoadXml(@"<MyXml><Employee></Employee></MyXml>"); 

XmlDocumentFragment xfrag = xdoc.CreateDocumentFragment(); 
xfrag.InnerXml = @"<Demographic><Age/><DOB/></Demographic>"; 

xdoc.DocumentElement.FirstChild.AppendChild(xfrag); 
+2

Ngắn và đến mức ... tuyệt vời! +1 – tigerswithguitars

+0

Giải pháp tuyệt vời – Nirman

+0

điều gì sẽ xảy ra nếu có dấu ngoặc kép (") giống như trong thuộc tính trong đoạn? – Raulp

11

Hãy thử điều này:

employeeNode.InnerXml = "<Demographic><Age/><DOB/></Demographic>"; 

Ngoài ra (nếu bạn có một tài liệu XML mà bạn muốn sử dụng):

employeeNode.AppendChild(employeeNode.OwnerDocument.ImportNode(otherXmlDocument.DocumentElement, true)); 
2

Xem xét sử dụng một XmlWriter để xây dựng mảnh vỡ của bạn trên một StringBuilder vì điều này sẽ cung cấp xác thực và thay thế ký tự cho bạn.

+0

@ffpf: 1 lời khuyên hay, nhưng không gian tên và XmlWriter luôn giúp tôi quay lại đến MSDN. – user7116

6

Là một thay thế, đây là cách bạn có thể làm điều đó trong một hơn LINQy 3,5 cách:

XDocument doc = XDocument.Load(@"c:\temp\test.xml"); 
XElement demoNode = new XElement("Demographic"); 
demoNode.Add(new XElement("Age")); 
demoNode.Add(new XElement("DOB")); 
doc.Descendants("Employee").Single().Add(demoNode); 
doc.Save(@"c:\temp\test2.xml"); 
0

Tất cả những gì tôi làm là tạo ra một đối tượng dữ liệu mới và mở file xml bằng ReadXML myDataset.ReadXML(path and file name).

Sau đó thêm hoặc xóa các hàng mà tôi cần và lưu lại tài liệu bằng cách sử dụng myDataset.WriteXML(path and file name).

Tạm biệt.

0

Không ai trong số này làm việc cho tôi vì vậy tôi chơi xung quanh abit và đây là giải pháp của tôi.

Trước tiên tải lên một trường văn bản (bạn có thể đặt nó vào hiển thị = false trong phiên bản công khai) tải dữ liệu vào trường văn bản như vậy.

string Path = Directory.GetCurrentDirectory() + "/2016"; 
      string pathFile = Path + "/klanten.xml"; 
      StreamReader sr = new StreamReader(pathFile); 
      txt.Text = sr.ReadToEnd(); 
      sr.Close(); 

trên nút lưu tải lên trường văn bản để lưu nó. Đừng quên bạn sẽ phải làm mới trường văn bản sau đó, nếu bạn muốn thêm nhiều địa chỉ/tên, tôi chưa bao gồm phần đó.

string name = Globals.s_Name; 
     string klanten = txt.Text; 
     string s = klanten; 
     XmlDocument xdoc = new XmlDocument(); 

     string klant = "<voornaam>" + naamBox1.Text + "</voornaam>"; 
     xdoc.LoadXml(s); 
     XmlDocumentFragment xfrag = xdoc.CreateDocumentFragment(); 
     xfrag.InnerXml = klant; 
     xdoc.DocumentElement.FirstChild.AppendChild(xfrag); 
     xdoc.Save(name + "/klanten.xml"); 
Các vấn đề liên quan