代码之家  ›  专栏  ›  技术社区  ›  philipp

ie9中的xpath——一般问题

  •  0
  • philipp  · 技术社区  · 12 年前

    我试图在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键控的哈希映射中插入包含“original”和“cloned”元素的对象。
    5. 使用xpath查询新文档
    6. 检索结果,获取id并从映射中获取原始元素。
    7. 我决定从最初没有的元素中删除所有id。

    完成。。。

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

    1 回复  |  直到 8 年前
        1
  •  0
  •   philipp    12 年前

    所以,根据我的编辑,我调整/修补了 this 脚本使名称空间工作,并添加了一些getter,使API更接近标准。可以看到测试页面 here .它对我来说很好,但也有缺点,因为它是一种黑客攻击,所以只有在检测到IE的情况下,我才会包含脚本。

    问题:

    • 用ID填充dom以完成上述问题的步骤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查询非常慢,所以广泛使用它们或使用IE可能不是一个好主意,但这是另一个问题。