2008-12-01 130 views
16

我需要创建一个包含多个名称空间的根元素的XmlDocument。我使用C#2.0或3.0如何使用XmlDocument将多个名称空间添加到根元素?

这里是我的代码:

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

电流输出:

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

但是,我需要的输出是:

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

我的问题:如何创建包含具有多个名称空间的根元素的XmlDocument

+0

根据您的代码,似乎您的目的是让具有默认名称空间“http://www.example.com”,但您所描述的所需输出表明不是名称空间的一部分。你能澄清吗? – Oppositional 2008-12-01 18:41:30

+0

@Oppositional - 继承的命名空间;没有明确的命名空间,所有子元素都将从父代继承。在这种情况下,该格式由期待我发布的期望输出的应用程序AdLib指示。 – 2008-12-01 18:49:55

回答

24

以下将生成您上面的要求所需的输出:

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

然而,似乎奇怪的是,在你的例子/所需输出相同的XML名称空间用于两个不同的前缀。希望这可以帮助。

0

尝试命名空间属性添加到根元素:

 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 - 嗯......我想知道在使用SetAttribute代替明确声明命名空间的根元素中创建2个属性是否有任何缺点? – 2008-12-01 18:54:10

5

可以明确创建元素命名空间前缀属性。然后,当您添加使用相同名称空间和相同前缀创建的后代元素时,XmlDocument将解决它不需要向元素添加名称空间声明。

运行这个例子,看看它是如何工作:

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

@罗伯特 - 感谢您的解释;它确实阐明了使用SetAttribute方法明确创建名称空间的能力。 – 2008-12-02 14:08:44

相关问题