关于c#:如何使用XmlDocument向根元素添加多个名称空间?

How do I add multiple namespaces to the root element with XmlDocument?

我需要创建一个包含多个名称空间的根元素的XmlDocument。使用C 2.0或3.0

这是我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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);

电流输出:

1
2
3
4
5
6
7
8
9
10
<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>

然而,我期望的输出是:

1
2
3
4
5
6
7
8
9
10
<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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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名称空间用于两个不同的前缀似乎很奇怪。希望这有帮助。


您可以显式地在元素上创建名称空间前缀属性。然后,当您添加同时使用相同名称空间和相同前缀创建的子代元素时,xmldocument会发现它不需要向元素添加名称空间声明。

运行此示例查看其工作原理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    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();
    }


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        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);