2008-12-01 36 views
16

Tôi cần tạo một XmlDocument với phần tử gốc chứa nhiều không gian tên. Đang sử dụng C# 2.0 hoặc 3.0Làm cách nào để thêm nhiều không gian tên vào phần tử gốc bằng XmlDocument?

Đây là mã của tôi:

XmlDocument doc = new XmlDocument(); 
XmlElement root = doc.CreateElement("JOBS", "http://www.example.com"); 
doc.AppendChild(root); 

XmlElement job = doc.CreateElement("JOB", "http://www.example.com"); 
root.AppendChild(job); 

XmlElement docInputs = doc.CreateElement("JOB", "DOCINPUTS", "http://www.example.com"); 
job.AppendChild(docInputs); 

XmlElement docInput = doc.CreateElement("JOB", "DOCINPUT", "http://www.example.com"); 
docInputs.AppendChild(docInput); 

XmlElement docOutput = doc.CreateElement("JOB", "DOCOUTPUT", "http://www.example.com"); 
docOutputs.AppendChild(docOutput); 

Sản lượng hiện tại:

<JOBS xmlns="http://www.example.com"> 
    <JOB> 
    <JOB:DOCINPUTS xmlns:JOB="http://www.example.com"> 
     <JOB:DOCINPUT /> 
    </JOB:DOCINPUTS> 
    <JOB:DOCOUTPUTS xmlns:JOB="http://www.example.com"> 
     <JOB:DOCOUTPUT /> 
    </JOB:DOCOUTPUTS> 
    </JOB> 
</JOBS> 

Tuy nhiên, sản lượng mong muốn của tôi là:

<JOBS xmlns:JOBS="http://www.example.com" xmlns:JOB="http://www.example.com"> 
    <JOB> 
    <JOB:DOCINPUTS> 
     <JOB:DOCINPUT /> 
    </JOB:DOCINPUTS> 
    <JOB:DOCOUTPUTS> 
    <JOB:DOCOUTPUT /> 
    </JOB:DOCOUTPUTS> 
    </JOB> 
</JOBS> 

Câu hỏi của tôi: làm thế nào để tạo một XmlDocument có chứa phần tử gốc với nhiều không gian tên?

+0

Dựa trên mã của bạn, có vẻ như ý định của bạn là có có một không gian tên mặc định là 'http://www.example.com', nhưng kết quả mong muốn mà bạn mô tả chỉ ra rằng không phải là một phần của không gian tên. Bạn có thể làm rõ? – Oppositional

+0

@Oppositional - kế thừa không gian tên từ ; mà không có một không gian tên rõ ràng, tất cả các phần tử con sẽ thừa hưởng từ cha mẹ. Trong trường hợp này, định dạng được dicated bởi các ứng dụng AdLib đó là mong muốn đầu ra mong muốn tôi đăng. –

Trả lời

24

Sau đây sẽ tạo ra kết quả mong muốn mà bạn yêu cầu nêu trên:

XmlDocument doc = new XmlDocument(); 

XmlElement root = doc.CreateElement("JOBS"); 
root.SetAttribute("xmlns:JOBS", "http://www.example.com"); 
root.SetAttribute("xmlns:JOB", "http://www.example.com"); 
doc.AppendChild(root); 

XmlElement job = doc.CreateElement("JOB"); 

XmlElement docInputs = doc.CreateElement("JOB", "DOCINPUTS", "http://www.example.com"); 
XmlElement docInput  = doc.CreateElement("JOB", "DOCINPUT", "http://www.example.com"); 
docInputs.AppendChild(docInput); 
job.AppendChild(docInputs); 

XmlElement docOutputs = doc.CreateElement("JOB", "DOCOUTPUTS", "http://www.example.com"); 
XmlElement docOutput = doc.CreateElement("JOB", "DOCOUTPUT", "http://www.example.com"); 
docOutputs.AppendChild(docOutput); 
job.AppendChild(docOutputs); 

doc.DocumentElement.AppendChild(job); 

Tuy nhiên, có vẻ như kỳ lạ rằng trong ví dụ của bạn/mong muốn đầu ra mà cùng một không gian tên XML được sử dụng với hai tiền tố khác nhau. Hi vọng điêu nay co ich.

+0

@Oppositional - Tôi đồng ý rằng các phần tử cha mẹ (JOBS) và các phần tử con (JOB) lẻ đều là khai báo khai báo cùng một không gian tên khi chỉ khai báo phần tử cha với vùng tên là đủ. –

+0

Điều đó là đủ. Nhưng nó không phải khi bạn đang giao tiếp với một tổ chức cố chấp như IRS, những người không thực hiện kế thừa không gian tên đúng cách. – Bon

0

cố gắng thêm thuộc tính namespace để phần tử gốc:

 XmlDocument doc = new XmlDocument(); 

     XmlElement root = doc.CreateElement("JOBS", "http://www.example.com"); 
     root.SetAttribute("xmlns:JOB", "http://www.example.com"); 

     doc.AppendChild(root); 

     XmlElement job = doc.CreateElement("JOB", "http://www.example.com"); 
     root.AppendChild(job); 

     XmlElement docInputs = doc.CreateElement("JOB", "DOCINPUTS", "http://www.example.com"); 
     job.AppendChild(docInputs); 

     XmlElement docInput = doc.CreateElement("JOB", "DOCINPUT", "http://www.example.com"); 
     docInputs.AppendChild(docInput); 

     XmlElement docOutput = doc.CreateElement("JOB", "DOCOUTPUT", "http://www.example.com"); 
     root.AppendChild(docOutput);  
+1

@ divo - hmm ... Tôi tự hỏi nếu có bất kỳ hạn chế nào khi chỉ tạo 2 thuộc tính trong phần tử gốc bằng cách sử dụng SetAttribute thay vì khai báo không gian tên một cách rõ ràng? –

5

Bạn rõ ràng có thể tạo namespace prefix thuộc tính trên một phần tử. Sau đó, khi bạn thêm các phần tử con cháu được tạo ra với cùng một không gian tên và cùng một tiền tố, XmlDocument sẽ làm việc ra rằng nó không cần phải thêm một khai báo vùng tên vào phần tử.

Run ví dụ này để xem cách làm việc này:

using System; 
    using System.Xml; 

    static void Main(string[] args) 
    { 
     XmlDocument d = new XmlDocument(); 
     XmlElement e = d.CreateElement("elm"); 

     d.AppendChild(e); 

     d.DocumentElement.SetAttribute("xmlns:a", "my_namespace"); 

     e = d.CreateElement("a", "bar", "my_namespace"); 
     d.DocumentElement.AppendChild(e); 
     e = d.CreateElement("a", "baz", "other_namespace"); 
     d.DocumentElement.AppendChild(e); 
     e = d.CreateElement("b", "bar", "my_namespace"); 
     d.DocumentElement.AppendChild(e); 

     d.Save(Console.Out); 

     Console.ReadLine(); 
    } 
+0

@Robert - cảm ơn lời giải thích; nó làm rõ khả năng tạo ra các không gian tên bằng phương thức SetAttribute. –

Các vấn đề liên quan