gpt4 book ai didi

xml - 如何使用 MSXML2 检测外部 XML 文档中的命名空间?

转载 作者:行者123 更新时间:2023-12-04 17:03:52 24 4
gpt4 key购买 nike

当使用 MSXML2 处理 XML 时,有充分的记录表明,要使任何 XPath 查询工作,您都需要定义 selectionNamespaces属性(property)。但是,如果您始终知道命名空间是什么,这只是一个简单的解决方法。我正在用 VBA 编写一个模块,我希望能够使用它来解析所有 Office XML 格式,并且我想要一个可以在加载文档时任意定义文档命名空间的函数。

目前,我发现以下是不错的第一次尝试:

Public DoDefineNamespaces(strRootNodeName As String, strFilePath As String, ByRef oMyDoc As MSXML2.DomDocument60)
Dim oRootNode As MSXML2.IXMLDomNode
Dim oMyDoc As MSXML2.DomDocument60
Dim oAttribute As MSXML2.IXMLDomNode
Sim strNamespaces As String

Set oMyDoc = New MSXML2.DomDocument60
oMyDoc.Load strFilePath
Set oRootNode = oMyDoc.SelectNodes("./*[name()='" & strRootNodeName & "']")
For Each oAttribute In oRootNode.Attributes
If oAttribute.Namespace = "http://www.w3.org/2000/xmlns/" Then
strNamespaces = strNamespaces & oAttribute.Xml
End If
Next oAttribute
oMyDoc.SetProperty("SelectionNamespaces", strNamespaces)
End Sub

对处理默认命名空间进行了一些细微的更改。但是,这对 XML 不起作用,如下所示:
<?xml>
<root xmlns:t="MyFirstNS">
<t:object1>
<r:object2 xmlns:r="MySecondNS" />
</t:object1>
</root>
</xml>

除了遍历之外,是否有一种方法可能比我的方法更好地处理此类问题 = 即根节点中未定义的任何命名空间?理想的 XPATH 1.0 表达式将选择所有 xmlns 属性节点,即使它们所在的命名空间尚未添加到 SelectionNamespaces,或者帮助构建 XSLT 转换,该转换将生成具有文档命名空间的节点集。

最佳答案

要确定文档中使用的所有 namespace ,请使用此 XPath 1.0 查询:

/*/namespace::*

这将包括重复项。

对于 XPath 2.0,您会选择

distinct-values(//*/fn:namespace-uri())

相反,因为 namespace 轴已被弃用。两者都只返回实际使用的 namespace (并省略未使用的 namespace )。此查询已删除重复的命名空间。

无论如何:如果你不关心命名空间,忽略它们可能更合理。在 XPath 1.0 中,您必须使用通配符轴步骤并在谓词中进行名称测试。匹配所有元素 <foo/>对于任意命名空间,使用 //*[local-name() = 'foo']分别 //*:foo在 XPath 2.0 中。

关于xml - 如何使用 MSXML2 检测外部 XML 文档中的命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22559479/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com