【问题标题】:XPath for id attribute with changing substring in middle?id属性的XPath在中间更改子字符串?
【发布时间】:2021-11-29 19:43:05
【问题描述】:

我有一个需要隔离 XPATH 标识符的网站 - 他们有一个像这样的 XPath ID //*[@id="panel-detail-6163748c7952a-partnerCode"]

问题是网站在每次页面加载时都会更改值6163748c7952a

是否有任何这样的 XPath 表达式可以匹配该字符串的第一个/最后一个部分?所以像//*[@id="panel-detail-*-partnerCode"]这样的通配符

【问题讨论】:

  • xpath 2 支持正则表达式。您使用的是什么版本的 xpath 处理器?

标签: html xml dom xpath


【解决方案1】:

这个XPath 2.0表达式,

//*[matches(@id, "^panel-detail-.*-partnerCode$")]

或这个 XPath 1.0 表达式,

//*[starts-with(@id, 'panel-detail-') and
    substring(@id, string-length(@id) - string-length('-partnerCode') + 1)  
                                                    = '-partnerCode']

将匹配所有id 属性值以指定子字符串开头和结尾的元素。

另请参阅

【讨论】:

    【解决方案2】:

    xpath 中的方法很少,例如starts-withends-with。很多时候人们用包含的内容替换它们,这应该是不鼓励的。

    请注意,结尾为 xpath v2.0

    xpath v1.0:

    //*[starts-with(@id,'panel-detail-') and contains(@id, '-partnerCode')]
    

    xpath v2.0:

    //*[starts-with(@id,'panel-detail-') and ends-with(@id, '-partnerCode')]
    

    【讨论】:

    • 除了我四个小时前已经回答的内容之外,您的回答还提供了哪些内容?
    • 我相信可读性。
    • 好吧,我的回答中缺少ends-with() 的XPath 1.0 解决方法很难阅读,但它是实现相同结果的标准习惯用法。我很惊讶地看到您承认 contains() 应该被劝阻,因为它也可以匹配而不是最后,然后继续在您的答案中使用它。
    • @kjhughes :我同意你的观点,应该避免并且应该避免contains。但是在 xpath 1.0 中我真的不知道如何解析结束子字符串。
    • 查看我的 answer 和其中引用的 Q/A,了解如何在 XPath 1.0 中有效地执行 ends-with()
    猜你喜欢
    • 2011-05-18
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    相关资源
    最近更新 更多