views:

1251

answers:

2

Hi there

I'm using VB 2008 and I'm trying to add a xmlns="mynamespace" attribute to an XDocument's root element.

The XML document is created by a 3rd party, and I have loaded it into a VB XDocument object. As it comes, it has no namespaces. I have been working on a local copy and I added in a namespace in a text editor, so that I can use the XMLToSchema in VB to enable intellisense etc, as per the instructions in the Beth Massi vids at MSDN. Now the rest of the code works I want to open the live documents again. Without the namespace, my XML literals don't resolve.

I've tried unsuccessfully to add in the XMLNS property to the root tag using a few methods, and the nearest I got was the following three code samples.

Dim myNS As XNamespace = "urn:nbf:namespacename"
myXML.Element("nameofrootelement").Add(myNS)

^^^^ The namespace was added as the value of the root element, not as an attribute.

XML.Root.Add(New XAttribute("xmlns", "name"))

^^^^ Generated the error: Run-time exception thrown : System.Xml.XmlException - The prefix '' cannot be redefined from '' to 'name' within the same start element tag.

but

XML.Root.Add(New XAttribute("test", "name"))

^^^^ works correctly. Presumably it doesn't like me manually trying to set a reserved attribute? This namespacing seems way too over complex from some of the Googling I've done.

How do I get around this problem? :D

Thanks!

+2  A: 

You need to understand that the true full name of any tag is the tagname as seen in the XML (known as the localname) and the namespace. By attempting to place xmlns="xxx" on to an element you are effectively trying to rename enmasse that element and all its descendants that aren't explicitly assigned their own namespace.

Just as the tagname is read only on an element the namespace of that element is readonly.

Perhaps the easiest solution (assuming you can't get the third-party to produce the XML properly in the first place) would be to inject the xmlns into the text before parsing.

AnthonyWJones
A: 

Thanks Anthony.

I think I need to get a better understanding of the namespaces.

I thought to .ToString it, then modify, then .Parse it also, but I wanted a better solution so that it would help me understand it a little better! I did try this though, and as you rightly point out, it affects all the descendants too, so thus it still breaks.

I will be working with multiple XML feeds all produced by different third parties, and I think for simplicity I will be leaving out the namespacing entirely!

My own custom parsing function rewrites the third party feeds into one uniformed document, which then gets processed by another routine. I'll be able to add a ns to that intermediate piece of XML which will help when coding the secondary function.

Thanks!