摘要:记得以前思归曾指导我们凡事都该多求一种alternative,看了ghj1976关于在.NET中利用XmlNamespaceManager来处理XPath名称空间引用的方法,又看了Zee关于直接在XPath过滤表达式中利用XPath内置节点函数来处理类似问题的另一种方法,那么我也来贡献一种非常有用的解决办法——利用MSXML中DOM的SelectionNamespaces二级属性(second-level properties)。
如果你还在基于ActiveScript脚本引擎或者COM的环境中操作XML的话,一般你都是使用Microsoft XML Parser(目前主要是用3.0或4.0)这套API,而且大部分时候你会与DOM打交道。在DOM对象上有很多的native properties,如validateOnLoad、async等等,这些属性通常会影响DOM运行时的表现。为了能够更方便的扩展一些新运行时的新属性,MSXML的DOM上提供了setProperty/getProperty的方法,用它们可以为DOM运行时提供基于key/value的额外属性,也即二级属性。
在MSXML 3.0中,为更方便的应用XPath等相关技术,DOM开始支持SelectionLanguage和SelectionNamespaces这两个二级属性。这个SelectNamespaces就是用来指定额外的名称空间映射的,如下:
dom.setProperty("SelectionNamespaces", "xmlns:x='urn:mine' xmlns:y='urn:yours'")dom.selectSingleNode("/x:foo/y:bar")
则如果dom节点的XML内容是这样的:
<foo xmlns="urn:mine"> <yours:bar xmlns:yours="urn:yours" /></foo>
便可以正确的选取到中间一行的urn:yours名称空间中的bar元素(注意本例中XML默认名称空间及名称空间等价的概念)。
这个技术在功能上等价于使用.NET中的XmlNamespaceManager,只是在非.NET环境中(包括在开发InfoPath表单中使用的Microsoft Script脚本环境或者IE的脚本环境中)这还是非常正式的解决方法(效率也会比使用XPath过滤表达式要高效一些)。
希望在你使用MSXML的DOM对象遇到类似问题时有所帮助吧。...[
阅读全文]