我正在尝试在 IE9 中进行一些 xpath 查询,并取得了一些成功,但肯定只是在尝试,我无法清楚地弄清楚什么可以工作,什么不能。
我想做两件事:
- 从加载的 xml 查询自定义命名空间中的元素
- 从具有自定义命名空间属性的内联 svg 查询元素
第一点有效,使用以下代码:
doc.setProperty( "SelectionLanguage", "XPath" );
doc.setProperty( "SelectionNamespaces", xpathNsString );
svg = cloneSVGNode( doc.selectSingleNode( '//graphic/svg:svg' ) );
其中doc
是对加载的 xml 的引用,xpathNsString 是:
"xmlns=\"http://www.w3.org/1999/xhtml\" " +
"xmlns:svg=\"http://www.w3.org/2000/svg\" "+
"xmlns:dc=\"http://purl.org/dc/elements/1.1/\" "+
"xmlns:cc=\"http://creativecommons.org/ns#\" "+
"xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" "+
"xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\" "+
"xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\" "+
"xmlns:mine=\"http://www.mine.org\" "+
"xmlns:html=\"http://www.w3.org/1999/xhtml\"";
以及cloneSVGNode
一个克隆整个结果的函数,这样我就可以将它附加到 DOM 中——这很有效。
稍后在代码中,我想查询(现在在 DOM 中)SVG 的一些元素,使用如下查询:
//svg:g[@mine:my-name="my-value"]
但这不起作用。我读到 IE 不支持对 DOM 元素的 xpath 查询,但是在这个 stackoverflow 问题中如何描述似乎有办法做到这一点。所以我抓住了问题答案中提到的框架版本(http://sourceforge.net/projects/html-xpath/)并进行了一些测试。结果,我能够获得一些 html 元素,但它拒绝为命名空间和 svg 工作,这对“普通 xml”有效。尽管如此,通过查看 lib 的源代码,我可以看到以下策略(我对此并不完全确定,但我认为总的来说是这样的):
- 将节点克隆到新的 xml 文档中
- 查询 xpath
- 返回真实节点的对应节点
那么,当 xml 和 dom 节点转换为 xml 时,是否可以让 IE9 对 DOM 进行命名空间 xpath 查询?
问候菲利普
编辑:
我继续尝试,最后我成功了,不知何故,代码很安静,但它提供了结果。所以我现在可以说:“答案是肯定的,这是可能的。” . 它仍然需要一些测试,但总体方法是:
- 创建一个新的空 xml 文档
- 设置适当的命名空间属性(如上所述)!重要
- 递归遍历上下文文档的树,通过新的 xml 文档创建新元素来克隆所有元素,
- 从而:从上下文文档的元素生成唯一的 id,并将其分配给克隆的元素和上下文文档的元素,如果它没有。比在以 id 为键的哈希图中插入一个包含“原始”和“克隆”元素的对象。
- 使用 xpath 查询新文档
- 检索结果,获取 id 并从地图中获取原始元素。
- 我决定从最初没有的元素中删除所有 id。
完毕...
如果有人感兴趣,我可以发布一些代码...