首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法找到Chrome DevTools给出的DevTools

无法找到Chrome DevTools给出的DevTools
EN

Stack Overflow用户
提问于 2014-11-13 13:49:44
回答 2查看 2.9K关注 0票数 4

当我在回答另一个问题有关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>,为什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-13 14:16:50

命名空间可以是前缀:

代码语言:javascript
复制
<root xmlns:ns="www.example.com"/>

或默认名称空间:

代码语言:javascript
复制
<root xmlns="www.example.com"/>

SVG位于默认名称空间中。像/svg这样的路径表达式告诉XPath处理器寻找一个名为"svg“的元素,它不存在任何名称空间。因此,该表达式只匹配:

代码语言:javascript
复制
<svg/>   or <svg xmlns=""/>

使用/*[name()='svg']只排除前缀命名空间。它仍然允许一个名为"svg“的元素,该元素位于默认名称空间中,没有前缀。第二个表达式匹配

代码语言:javascript
复制
<svg xmlns="http://www.w3.org/2000/svg"/>

但不是

代码语言:javascript
复制
<ns:svg xmlns:ns="http://www.w3.org/2000/svg"/>

要证明这一点,请考虑以下XSLT样式表:

代码语言:javascript
复制
<?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文档:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg"/>

在以下方面的成果:

代码语言:javascript
复制
<?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工具不是我的专业领域,我不能评论如何在那里这样做。

票数 6
EN

Stack Overflow用户

发布于 2014-11-13 14:13:06

HTML5和text/html允许您在一个文档中混合HTML、MathML和SVG元素,并且不需要使用与不同词汇表相关联的名称空间。但是,对于XPath,您需要确保将前缀绑定到SVG命名空间,并在查询中使用该前缀,就像在DOM树中一样,SVG元素位于与HTML元素不同的名称空间中。在我不知道的开发人员工具中,这是否可能,但使用API,通常有一些方法可以设置名称空间解析器,将您希望在XPath表达式中使用的前缀映射到命名空间URL。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26910417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档