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

Posted

技术标签:

【中文标题】使用 Microsoft.xmldom 更改 XML 元素的命名空间前缀,以便利用 GetElementsByTagName【英文标题】:Change the namespace prefix of XML elements using Microsoft.xmldom in order to utilize GetElementsByTagName 【发布时间】:2015-12-14 16:12:32 【问题描述】:

当使用一个 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 对象中使用的当前命名空间前缀?

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

谢谢,那是票!我尝试过 .setproperty 方法,但仍在使用 .GetElementsByTagName。当我切换到使用 .selectNodes 时,它就像一个魅力。

以上是关于使用 Microsoft.xmldom 更改 XML 元素的命名空间前缀,以便利用 GetElementsByTagName的主要内容,如果未能解决你的问题,请参考以下文章

关于odoo中xml写的js怎么用

XML处理技术

js 读取XML

js解析xml

JsExcelXml.js的源码

javaScript 解析xml 内容.