Как добавить несколько пространств имен в корневой элемент с помощью XmlDocument?
Мне нужно создать XmlDocument
с корневым элементом, содержащим несколько пространств имен. Я использую С# 2.0 или 3.0
Вот мой код:
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
, который содержит корневой элемент с несколькими пространствами имен?
Ответы
Ответ 1
Ниже вы получите требуемый результат, который вы запросили выше:
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 для двух разных префиксов. Надеюсь, это поможет.
Ответ 2
Вы можете явно создавать атрибуты префикса пространства имен для элемента. Затем, когда вы добавляете элементы-потомки, созданные с одинаковым пространством имен и одним и тем же префиксом, 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();
}
Ответ 3
попытайтесь добавить атрибут пространства имен в корневой элемент:
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);