1

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

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

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

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

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

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

^^^^ 生成错误:抛出运行时异常:System.Xml.XmlException - 前缀 '' 不能在同一起始元素标记内从 '' 重新定义为 'name'。

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

^^^^ 工作正常。大概它不喜欢我手动尝试设置保留属性?从我所做的一些谷歌搜索来看,这种命名空间似乎过于复杂。

我该如何解决这个问题?:D

谢谢!


更新

谢谢安东尼。

我想我需要更好地理解命名空间。

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

我将使用由不同第三方生成的多个 XML 提要,我认为为简单起见,我将完全省略命名空间!

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

谢谢!

4

1 回答 1

2

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

正如标记名在元素上是只读的一样,该元素的命名空间也是只读的。

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

于 2009-01-20T13:29:49.563 回答