How do I add multiple namespaces to the root eleme

2020-02-05 07:11发布

问题:

I need to create an XmlDocument with a root element containing multiple namespaces. Am using C# 2.0 or 3.0

Here is my code:

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

The current output:

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

However, my desired output is:

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

My question: how do I create an XmlDocument that contains a root element with multiple namespaces?

回答1:

The following will generate the desired output that you requested above:

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

However, it seems odd that in your example/desired output that the same XML namespace was used against two different prefixes. Hope this helps.



回答2:

You can explicitly create namespace prefix attributes on an element. Then when you add descendant elements that are created with both the same namespace and the same prefix, the XmlDocument will work out that it doesn't need to add a namespace declaration to the element.

Run this example to see how this works:

    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:

try to add the namespace attribute to the root element:

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