xml - 使用 Microsoft.xmldom 更改 XML 元素的命名空间前缀以利用 GetElementsByTagName

标签 xml namespaces visual-foxpro prefix xmldom

在使用 XML 对象时,我需要预测所使用的命名空间前缀不时会有所不同(3P 因这个而臭名昭著,有时甚至不包括每个元素中的前缀并让它由其父元素隐含)。我知道如何在 .NET 中解决这个问题,但是这个项目需要我使用 VFP 和 Microsoft.xmldom 对象。

问题是,当我使用 GetElementsByTagName 时,如果前缀未使用或已更改,我将找不到该元素:

<ExampleTag>Example</ExampleTag>

loNode = loRoot.getElementsByTagName("ns2:ExampleTag").Item(0)

反之亦然:
<ns2:ExampleTag>Example</ns2:ExampleTag>

loNode = loRoot.getElementsByTagName("ExampleTag").Item(0)

我一直在阅读有关 getElementsByTagNameNS 的信息,但它总是错误地指出它不评估为对象。

如果我知道命名空间 URI 总是相同的,我是否可以不利用它来发挥我的优势并以某种方式忽略/更改 XML 对象中使用的当前命名空间前缀?

最佳答案

你是对的,如果命名空间 URI 总是相同的,那么实际的前缀只是绒毛。关键是设置SelectionNamespaces属性(property)。

oDoc = createobject("MSXML2.DOMDocument.6.0")
oDoc.setProperty("SelectionNamespaces", [xmlns:foo="] + m.cNamespaceURI + ["])
oDoc.LoadXML(...)

with oDoc.selectNodes("//foo:ExampleTag")
   ...
endwith

通过这种方式,您可以根据您选择的前缀(此处为 foo )选择节点,而不管您的 XML 输入使用的实际前缀(如果有的话)。

关于xml - 使用 Microsoft.xmldom 更改 XML 元素的命名空间前缀以利用 GetElementsByTagName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34271647/

相关文章:

C++ 名称与 typedef 别名和继承名称的冲突

visual-foxpro - Visual FoxPro 函数调用中的双星号意味着什么?

sql - 命令包含无法识别的词组/关键字VFP和SQL

c++ - 在 C++ 中检测命名空间

php - 循环遍历 XML,仅在特定 ID 处循环 "look"

xml - 加载不包含命名空间的 XML

android - BottomNavigationView:更改标题和图标之间的间隙大小

c++ - 命名空间中的私有(private)类

excel - 无法将所有行从 FoxPro 导出到 Excel?

xml - 用于纯 XML 而不是 SOAP 的 WSDL 服务