How to add attributes to xml using XmlDocument in c# .net CF 3.5

Vicky picture Vicky · Aug 4, 2010 · Viewed 53.2k times · Source

I need to create an attribute "abc" with the prefix "xx" for an element "aaa". The following code adds the prefix but it also adds the namespaceUri to the element.

Required Output:

<mybody>
<aaa xx:abc="ddd"/>
<mybody/>

My Code:

  XmlNode node = doc.SelectSingleNode("//mybody");
  XmlElement ele = doc.CreateElement("aaa");

  XmlAttribute newAttribute = doc.CreateAttribute("xx","abc",namespace);              
  newAttribute.Value = "ddd";

  ele.Attributes.Append(newAttribute);

  node.InsertBefore(ele, node.LastChild);

The above code generates :

<mybody>
<aaa xx:abc="ddd" xmlns:xx="http://www.w3.org/1999/XSL/Transform"/>
<mybody/>

Desired output is

<mybody>
<aaa xx:abc="ddd"/>
<mybody/>

And the declaration of the "xx" attribute should be done in the root node like :

<ns:somexml xx:xsi="http://www.w3.org/1999/XSL/Transform"  xmlns:ns="http://x.y.z.com/Protocol/v1.0">

How can if get the output in the deisred format? If the xml is not in this desired format then it cannot be processed anymore..

Can anyone help?

Thanks, Vicky

Answer

Jon Skeet picture Jon Skeet · Aug 4, 2010

I believe it's just a matter of setting the relevant attribute directly on the root node. Here's a sample program:

using System;
using System.Globalization;
using System.Xml;

class Test
{
    static void Main()
    {
        XmlDocument doc = new XmlDocument();
        XmlElement root = doc.CreateElement("root");

        string ns = "http://sample/namespace";
        XmlAttribute nsAttribute = doc.CreateAttribute("xmlns", "xx",
            "http://www.w3.org/2000/xmlns/");
        nsAttribute.Value = ns;
        root.Attributes.Append(nsAttribute);

        doc.AppendChild(root);
        XmlElement child = doc.CreateElement("child");
        root.AppendChild(child);
        XmlAttribute newAttribute = doc.CreateAttribute("xx","abc", ns);
        newAttribute.Value = "ddd";        
        child.Attributes.Append(newAttribute);

        doc.Save(Console.Out);
    }
}

Output:

<?xml version="1.0" encoding="ibm850"?>
<root xmlns:xx="http://sample/namespace">
  <child xx:abc="ddd" />
</root>