ie9中的xpath - 一般问题

时间:2012-09-19 07:00:57

标签: dom xpath namespaces internet-explorer-9

我正在尝试在IE9中进行一些xpath查询,其中有一些成功,但肯定只是尝试而且我无法清楚地知道可以工作什么不可以。

我想做两件事:

  1. 从已加载的xml
  2. 中查询自定义命名空间中的元素
  3. 查询具有自定义命名空间属性的内联svg中的元素
  4. 第一点有效,使用此代码:

    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工作,这对“plain xml”起作用。然而,通过浏览lib的源代码,我可以看到以下策略(我对此并不完全确定,但我认为总而言之就是这样):

    1. 将节点克隆到新的xml doc
    2. 查询xpath
    3. 返回真实节点的对应节点
    4. 那么,当xml和dom节点可能转换为xml时,是否有可能使IE9对DOM进行命名空间的xpath查询?

      问候菲律宾

      修改

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

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

        如果有人被迫,我可以张贴一些代码......

1 个答案:

答案 0 :(得分:0)

因此,基于我的编辑,我调整了this脚本,以便命名空间工作并添加一些getter来使API更接近标准。可以看到测试页here。它适用于我的目的,但有其缺点,只是因为它是一种黑客,所以我只在检测到IE时才包含脚本。

<强>的问题:

  • dom充满了ID,以完成上述问题的第6步,
  • 'onpropertychange'侦听器附加到DOM中的每个元素
  • 在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-queries安静缓慢,因此广泛使用它们或者使用IE可能不是一个好主意,但这是另一个问题。