将XML Namespace属性添加到第三方xml?

时间:2009-01-20 13:14:59

标签: xml vb.net namespaces linq-to-xml

我正在使用VB 2008,我正在尝试将xmlns =“mynamespace”属性添加到XDocument的根元素中。

XML文档由第三方创建,我已将其加载到VB XDocument对象中。它来了,它没有名称空间。我一直在处理本地副本,并在文本编辑器的命名空间中添加,因此我可以使用VB中的XMLToSchema来启用智能感知等,按照MSDN中Beth Massi视频中的说明。现在剩下的代码工作了,我想再次打开实时文档。如果没有命名空间,我的XML文字就无法解析。

我尝试使用几种方法将XMLNS属性添加到根标记失败,最接近的是以下三个代码示例。

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

^^^^名称空间被添加为根元素的值,而不是属性。

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

^^^^生成错误:抛出运行时异常:System.Xml.XmlException - 无法在同一个start元素标记内从''重新定义''到'name'前缀''。

但是

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

^^^^正常工作。据推测它不喜欢我手动设置保留属性?这个命名空间似乎与我所做的一些谷歌搜索过于复杂。

如何解决这个问题? :d

谢谢!


更新

谢谢安东尼。

我认为我需要更好地了解命名空间。

我想。ToString,然后修改,然后。Parse它也是,但我想要一个更好的解决方案,这样可以帮助我更好地理解它!我确实试过这个,正如你正确指出的那样,它也影响了所有的后代,所以它仍然会破坏。

我将使用由不同第三方制作的多个XML Feed,我认为为了简单起见,我将完全忽略命名空间!

我自己的自定义解析功能将第三方提要重写为一个统一文档,然后由另一个例程处理。我将能够在该中间XML片段中添加一个ns,这将有助于编写辅助函数。

谢谢!

1 个答案:

答案 0 :(得分:2)

您需要了解任何标记的真实全名是XML中的标记名(称为localname)和名称空间。通过尝试将xmlns =“xxx”放置到元素上,您实际上正在尝试重命名该元素及其未明确分配其自己的命名空间的所有后代的enmasse。

正如标记名只读取元素一样,该元素的名称空间是只读的。

也许最简单的解决方案(假设您无法让第三方正确地生成XML)将在解析之前将xmlns注入到文本中。