Search code examples
.netnamespaceslinq-to-xmlgml

Problem creating an XElement object with GML namespace


I am trying to build a XML document using the GML namespace and XML to LINQ.

My goal is an XElement with contents like this:

<gml:name>...</gml:name>

But I get the following:

<name xmlns="http://www.opengis.net/gml" />

The problem is that the gml: is missing from the element. Why is that?


My code is as follows:

XNamespace nsGML = "http://www.opengis.net/gml";
XElement item = new XElement(nsGML + "name");

Solution

  • First of all this XML

    <name xmlns="http://www.opengis.net/gml" />
    

    is equivalent to this XML

    <gml:name xmlns:gml="http://opengis.net/gml" />
    

    And all XML consumers should treat it as same. That said you can achieve the second output like this:

    XNamespace nsGML = "http://www.opengis.net/gml";
    XElement item = new XElement(nsGML + "name",
                        new XAttribute(XNamespace.Xmlns + "gml", nsGML.NamespaceName));
    

    If you don't specify the namespace declaration attribute LINQ to XML will pick a prefix automatically for you (in this case it uses the empty one). If you want to force usage of a specific prefix you need to provide the namespace declaration attribute.