【问题标题】:xpath in ie9 -- general questionsie9 中的 xpath——一般问题
【发布时间】:2012-09-19 07:00:56
【问题描述】:

我正在尝试在 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 查询,但是this stackoverflow question 中的描述似乎有办法做到这一点。所以我抓住了问题答案(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 为键的 hashmap 中插入一个包含“原始”和“克隆”元素的对象。
  5. 使用 xpath 查询新文档
  6. 检索结果,获取 id 并从地图中获取原始元素。
  7. 我决定从最初没有的元素中删除所有 id。

完成...

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

【问题讨论】:

    标签: dom xpath namespaces internet-explorer-9


    【解决方案1】:

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

    问题:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-12-12
      • 2018-05-06
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多