views:

5811

answers:

5

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"&gt;
  <JOB>
    <JOB:DOCINPUTS xmlns:JOB="http://www.example.com"&gt;
      <JOB:DOCINPUT />
    </JOB:DOCINPUTS>
    <JOB:DOCOUTPUTS xmlns:JOB="http://www.example.com"&gt;
      <JOB:DOCOUTPUT />
    </JOB:DOCOUTPUTS>
  </JOB>
</JOBS>

However, my desired output is:

<JOBS xmlns:JOBS="http://www.example.com" xmlns:JOB="http://www.example.com"&gt;
  <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?

A: 

Hi,

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);
0xA3
@divo - hmm... I wonder if there is any drawback to just creating 2 attributes in the root element using SetAttribute in lieu of expicitly declaring the namespace?
Metro Smurf
A: 

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();
    }
Robert Rossney
@Robert - thanks for the explanation; it does clarify the ability to explicity create the namespaces with the SetAttribute method.
Metro Smurf
+3  A: 

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.

Oppositional
@Oppositional - I agree that it is odd the parent (JOBS) and child (JOB) elements are both explicity declaring the same namespace when just declaring the parent element with the namespace should suffice.
Metro Smurf
A: 

It helped me thanks for the post.

vaibhavs
please do not post unless adding something to the discussion. Thx
Jon
A: 

I have query regarding to xml.I want to put single tab after the root element like this..

Successfull//Please kindly give some solutions related to this how i can display it on the xml... ----This code is generated by the data set.

<JOB:DOCINPUTS>
  <JOB:DOCINPUT />
</JOB:DOCINPUTS>

Bilal
You'll need to post a new question. Welcome to SO. And here's an FAQ that will help: http://stackoverflow.com/faq
Metro Smurf