2

我正在尝试将Xml我准备好的一段文本添加到 vb.net 中的现有文档中,我正在使用XmlDocument该类。这是我的代码(简化以解释问题):

Dim s As String = "<RelativeLayout android:layout_width=""fill_parent"" android:layout_height=""fill_parent"" android:layout_weight=""1.0"" />"
Dim tempdoc = New XmlDocument()
tempdoc.LoadXml("<doc />")
ns = New XmlNamespaceManager(tempdoc.NameTable)
ns.AddNamespace("android", "http://schemas.android.com/apk/res/android")
tempdoc.DocumentElement.SetAttribute("xmlns:android", "http://schemas.android.com/apk/res/android")
Dim frag = tempdoc.CreateDocumentFragment()
frag.InnerXml = s

最后一条指令生成一个 XmlException,上面写着“android prefix is undeclared”。我的印象是 XmlNamespaceManager(第 4-5 行)或直接编写命名空间属性(第 6 行)会解决这个问题,但显然不是。

我究竟做错了什么?

我知道我可以使用该createelement方法手动编写元素,但我给出的示例被简化以解释问题。实际上,字符串"s"是一个有很多属性和子节点的大块,Xml用代码手动编写它会很痛苦。如果可能的话,我想要做的是将整个文件添加Xml到文档中。

4

2 回答 2

1

设置InnerXml属性时,它不使用命名空间管理器中的上下文。相反,它假定所有名称空间都将在给定的 XML 片段内显式定义。因此,这个最简单的解决方案是只在片段中包含命名空间声明,如下所示:

Dim s As String = "<RelativeLayout xmlns:android=""http://schemas.android.com/apk/res/android"" android:layout_width=""fill_parent"" android:layout_height=""fill_parent"" android:layout_weight=""1.0"" />"

如果您不能在片段字符串中执行此操作,则始终可以在运行时加载该片段并通过该SetAttribute方法向其添加名称空间声明属性。然后你可以使用修改后的片段来赋予InnerXml属性。

或者,您可以求助于使用该CreateElement方法,这将允许您使用名称空间管理器。

于 2013-09-13T12:32:12.043 回答
0

我建议查看 System.Xml.Linq 命名空间中的 XElement 和 XDocument。它提供了你正在寻找的东西 一个基本的想法就是你想要的东西是这样的

XElement root = new XElement("RelativeLayout,
            new XAttribute("android:layout_width", ""),
            new XAttribute("fill_parent", "") //etc
            );
root.Add(XElement.Parse(s));

请注意,我没有测试此代码,但我确实经常使用非常接近此的代码,因此语法很接近。

于 2013-09-13T12:18:05.370 回答