2008-12-01 7 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 - hmm ... Интересно, существует ли какой-либо недостаток только для создания 2 атрибутов в корневом элементе с использованием SetAttribute вместо явного объявления пространства имен? – 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

@Robert - спасибо за объяснение; он разъясняет способность к эксплозиям создавать пространства имен с помощью метода SetAttribute. – 2008-12-02 14:08:44