0

我正在尝试在 IE9 中进行一些 xpath 查询,并取得了一些成功,但肯定只是在尝试,我无法清楚地弄清楚什么可以工作,什么不能。

我想做两件事:

  1. 从加载的 xml 查询自定义命名空间中的元素
  2. 从具有自定义命名空间属性的内联 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 的源代码,我可以看到以下策略(我对此并不完全确定,但我认为总的来说是这样的):

  1. 将节点克隆到新的 xml 文档中
  2. 查询 xpath
  3. 返回真实节点的对应节点

那么,当 xml 和 dom 节点转换为 xml 时,是否可以让 IE9 对 DOM 进行命名空间 xpath 查询?

问候菲利普

编辑:

我继续尝试,最后我成功了,不知何故,代码很安静,但它提供了结果。所以我现在可以说:“答案是肯定的,这是可能的。” . 它仍然需要一些测试,但总体方法是:

  1. 创建一个新的空 xml 文档
  2. 设置适当的命名空间属性(如上所述)!重要
  3. 递归遍历上下文文档的树,通过新的 xml 文档创建新元素来克隆所有元素,
  4. 从而:从上下文文档的元素生成唯一的 id,并将其分配给克隆的元素和上下文文档的元素,如果它没有。比在以 id 为键的哈希图中插入一个包含“原始”和“克隆”元素的对象。
  5. 使用 xpath 查询新文档
  6. 检索结果,获取 id 并从地图中获取原始元素。
  7. 我决定从最初没有的元素中删除所有 id。

完毕...

如果有人感兴趣,我可以发布一些代码...

4

1 回答 1

0

因此,根据我的编辑,我调整/修补了这个脚本,以便命名空间工作并添加一些 getter 以使 API 更接近标准。可以在这里看到一个测试页。它非常适合我的目的,但也有它的缺点,只是因为它是一种 hack,所以我只在检测到 IE 时才包含脚本。

问题:

  • dom 填充了 ID 以完成上述问题的第 6 步,
  • DOM 中的每个元素都附加了一个“onpropertychange”侦听器,
  • ie 中的性能最多慢 20 倍,
  • 奇怪的是,不是所有命名空间的项目都被 IE 找到,
  • ...

现在,我将结束我对客户端 xpath 使用的研究,并得出以下结论:

如果考虑在客户端使用 xml 和 xpath 的所有命名空间功能,如果完成以下操作,它就可以工作:

  • 网站必须带有Content-type: application/xhtml+xml标题,因此页面必须包含有效的 xhtm,
  • 还必须有一个X-UA-Compatible: IE=9带有<meta http-equiv="X-UA-Compatible" content="IE=9" />标签的标题,
  • 命名空间必须提前声明,在测试页面和修补脚本中,这是使用命名空间解析器完成的,
  • 在真正高效之前,应该检查 IE 是否真的为所有需要的查询找到了元素
  • 人们应该认为 IE xpath 查询非常缓慢,因此广泛使用它们或使用 IE 可能不是一个好主意,但这是另一个问题。
于 2012-09-21T08:02:34.737 回答