2008-12-01 9 views
16

Potrzebuję utworzyć XmlDocument z elementem głównym zawierającym wiele przestrzeni nazw. Używam C# 2.0 lub 3.0Jak dodać wiele obszarów nazw do elementu głównego za pomocą XmlDocument?

Tu jest mój kodu:

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

Prąd wyjściowy:

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

Jednak mój sygnał wyjściowy jest:

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

Moje pytanie: Jak utworzyć XmlDocument, który zawiera element główny z wieloma przestrzeniami nazw?

+0

Wydaje się, że na podstawie Twojego kodu ma domyślny obszar nazw "http://www.example.com", ale pożądane wyniki, które opisujesz, wskazują, że nie jest częścią przestrzeni nazw. Możesz wyjaśnić? – Oppositional

+0

@Oppozycyjny - dziedziczy przestrzeń nazw od ; bez jawnej przestrzeni nazw wszystkie elementy potomne odziedziczą po rodzicu. W takim przypadku format jest zależny od aplikacji AdLib, która oczekuje żądanych wydruków. –

Odpowiedz

24

Poniższa przyniesie pożądany wynik, że wzywa się powyżej:

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

Jednak wydaje się dziwne, że w przykładzie/życzenia wyjście, które wykorzystywało tę samą przestrzeń nazw XML wobec dwóch różnych prefiksów. Mam nadzieję że to pomoże.

+0

@Oppositional - Zgadzam się, że to jest dziwne rodzic (Praca) i dziecko (pracy) elementy są zarówno jawnie deklarowania tej samej przestrzeni nazw, gdy tylko deklarując elementu nadrzędnego z nazw powinno wystarczyć. –

+0

To powinno wystarczyć. Ale nie dzieje się tak, kiedy współpracujesz z upartą organizacją, taką jak IRS, która nie wykonuje prawidłowo dziedziczenia przestrzeni nazw. – Bon

0

spróbować dodać atrybut namespace do elementu głównego:

 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 ... Zastanawiam się, czy istnieje jakakolwiek wada po prostu tworząc 2 atrybuty elementu głównego za pomocą setAttribute zamiast expicitly deklarowania przestrzeni nazw? –

5

Można jawnie tworzyć namespace prefix atrybutów elementu. Następnie, po dodaniu elementów potomnych, które są tworzone z tą samą przestrzenią nazw i tym samym prefiksem, XmlDocument wykaże, że nie musi dodawać deklaracji przestrzeni nazw do elementu.

uruchomić ten przykład, aby zobaczyć, jak to działa:

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 - dzięki za wyjaśnienie; Wyjaśnia to zdolność do explicity tworzenia przestrzeni nazw za pomocą metody SetAttribute. –

Powiązane problemy