当我在回答另一个问题有关Selenium的问题时,正在试验一些另一个问题 SVG路径时,我发现XPath在Chrome上有一种奇怪的行为(我没有在其他浏览器上尝试)。
在http://www.amcharts.com/svg-maps/?map=usa上,为什么不 XPath工作呢?
//*[@id="chartdiv"]/div/div[1]/svg/g[7]/g/g[1]
而这个做
//*[@id="chartdiv"]/div/div[1]/*[name()="svg"]/*[name()="g"][7]/*[name()="g"]/*[name()="g"][2]
我必须做以下修改:
/g变成/*[name()="g"]/svg变成/*[name()="svg"]/path变成/*[name()="path"]奇怪的是,我通过右键单击元素XPath获得了第一个XPath,并从那里复制了XPath。

我在http://gmsgroup.com/municenter.asp上有另一个例子,其中:
//*[@id='ext-gen203']/*[name()='svg']/*[name()='a']/*[name()='path'][starts-with(@d, 'M136.65')]/..工作,//*[@id='ext-gen203']/*[name()='svg']/*[name()='a'][@title='Hawaii']没有。在这里,/*[name()='a'][@title='Hawaii']找不到<a title="Hawaii"></a>,为什么?
发布于 2014-11-13 14:16:50
命名空间可以是前缀:
<root xmlns:ns="www.example.com"/>或默认名称空间:
<root xmlns="www.example.com"/>SVG位于默认名称空间中。像/svg这样的路径表达式告诉XPath处理器寻找一个名为"svg“的元素,它不存在任何名称空间。因此,该表达式只匹配:
<svg/> or <svg xmlns=""/>使用/*[name()='svg']只排除前缀命名空间。它仍然允许一个名为"svg“的元素,该元素位于默认名称空间中,没有前缀。第二个表达式匹配
<svg xmlns="http://www.w3.org/2000/svg"/>但不是
<ns:svg xmlns:ns="http://www.w3.org/2000/svg"/>要证明这一点,请考虑以下XSLT样式表:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="*[name() ='svg']">
<hit/>
</xsl:template>
</xsl:transform>适用于以下输入,即缩短的SVG文档:
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg"/>在以下方面的成果:
<?xml version="1.0" encoding="UTF-8"?>
<hit/>您可以在网上查看这里。
编辑(响应您的评论)
更清楚地说,这是否意味着SVG默认名称空间覆盖页面中的名称空间,因此不处理@title=‘夏威夷’之类的表达式?
HTML元素本身没有名称空间,SVG也不“覆盖”页面的命名空间。svg元素上的默认命名空间仅适用于自身和所有子元素(包括其内的a[@title='Hawaii']元素)。
//*[@id='ext-gen203']/*[name()='svg']/*[name()='a'][@title='Hawaii']应该能够找到a元素,我很惊讶它没有找到。
在哪里可以找到默认名称空间的规范?
如果您的意思是默认名称空间,请看这里:http://www.w3.org/TR/REC-xml-names/#scoping-defaulting。如果您指的是SVG规范,请研究SVG规范的以下章节:http://www.w3.org/TR/SVG/struct.html。
这是否也意味着没有比//@id='ext-gen203'/name()='svg'/name()='a'/name()='path'/..?更好的方法
更好的方法是注册或声明这些名称空间,从而通过前缀(正如Martin所指出的那样)使它们可以在Xpath表达式中使用。Chrome工具不是我的专业领域,我不能评论如何在那里这样做。
发布于 2014-11-13 14:13:06
HTML5和text/html允许您在一个文档中混合HTML、MathML和SVG元素,并且不需要使用与不同词汇表相关联的名称空间。但是,对于XPath,您需要确保将前缀绑定到SVG命名空间,并在查询中使用该前缀,就像在DOM树中一样,SVG元素位于与HTML元素不同的名称空间中。在我不知道的开发人员工具中,这是否可能,但使用API,通常有一些方法可以设置名称空间解析器,将您希望在XPath表达式中使用的前缀映射到命名空间URL。
https://stackoverflow.com/questions/26910417
复制相似问题