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

Change the namespace prefix of XML elements using Microsoft.xmldom in order to utilize GetElementsByTagName

在使用 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 属性.

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

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

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