【问题标题】:Testing text() nodes vs string values in XPath在 XPath 中测试 text() 节点与字符串值
【发布时间】:2016-04-08 05:15:48
【问题描述】:

我有一个节点如下:

<span class="portal-text-medium">Office Hours</span>

对于我使用的 XPath

//span[text()='Office Hours']

这应该有效,但它永远不会。我可以使用*contains(text(),'Office Hours')]*,但找不到完全匹配的,我必须验证没有“*”。这不是唯一一次对我不起作用。我以前见过它工作,所以我不知道出了什么问题。有什么想法吗?

是的,我可以并且确实使用starts-with,但并不完全相同。

【问题讨论】:

  • 我在 Chrome 中打开了该页面,我进行了检查,然后按 ctrl-f 在左下角打开一个框,我可以在其中输入 xpaths。如果 xpath 匹配,则显示匹配数,第一个以黄色突出显示。实际上,即使没有找到匹配项,也会显示匹配项的数量,并且显示为 0。当我使用这个 xpath 时,会显示 0 个匹配项。当我使用 contains() 或 starts-with() 时,会显示 14 个左右的匹配项。

标签: html xml xpath


【解决方案1】:

将 contains 与 AND 操作一起使用,这将帮助您找到确切的元素

//span[contains(@class, 'portal-text-medium') and text()='Office Hours']

【讨论】:

    【解决方案2】:

    XPath text() = 不同于 XPath . =

    (匹配文本节点与匹配字符串值不同)

    以下 XPath 相同...

    1. //span[text() = 'Office Hours']

      选择span 元素 有一个 直接text node 等于“办公时间”。

    2. //span[. = 'Office Hours']

      选择 string value 等于 'Office Hours`span 元素。

    简而言之,对于element nodes

    元素节点的string-valuestring-values 的所有文本节点 descendants 的元素 文档顺序中的节点。

    示例

    以下span 元素仅匹配#1

    • &lt;span class="portal-text-medium"&gt;Office Hours&lt;br/&gt;8:00-10:00&lt;/span&gt;
    • &lt;span class="portal-text-medium"&gt;My&lt;br/&gt;Office Hours&lt;/span&gt;

    以下span 元素仅匹配#2

    • &lt;span class="portal-text-medium"&gt;&lt;b&gt;Office&lt;/b&gt; Hours&lt;/span&gt;
    • &lt;span class="portal-text-medium"&gt;&lt;b&gt;&lt;i&gt;Office Hours&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;

    以下span 元素将同时匹配#1 和#2

    • &lt;span class="portal-text-medium"&gt;Office Hours&lt;/span&gt;

    【讨论】:

    • 因此,对于使用“.”,字符串的各个部分可以处于不同的深度,只要将其附加到您要搜索的值即可?我想有时当我遇到这个问题时,我应该尝试一下,我应该使用 .因为也许还有一些我不知道的额外关卡。
    • 你明白了。更准确地说,根据 XPath 建议:元素节点的字符串值是该元素节点的所有文本节点后代的字符串值按文档顺序串联。 答案已更新。谢谢。
    猜你喜欢
    • 2011-03-25
    • 2011-04-20
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 2016-11-27
    • 2013-01-23
    • 2010-11-27
    • 1970-01-01
    相关资源
    最近更新 更多