【问题标题】:php simple xpath questionphp简单的xpath问题
【发布时间】:2011-03-14 21:29:51
【问题描述】:

我有这个 div:

<div class="product-name">Product1</div>

我也有这个div:

<div class="product-name gold">Product2</div>

如何更改此 xpath 查询以获取 包含 产品名称的任何 div?而不是完全匹配。

/html/body//div[@class='product-name']

我用谷歌搜索了它,但我只能找到在节点内搜索值而不是属性时如何使用contains

编辑

【问题讨论】:

  • 请提供您的源文件。
  • @Alex,除了我提供的内容之外,您为什么需要查看任何来源?
  • 有效的 XML 应该只有一个根节点。用&lt;html&gt;&lt;body&gt;..&lt;/body&gt;&lt;/html&gt; 包裹你的 div,一切都会好起来的。
  • 因为可能有问题。您的 XPath 测试工具允许无效的 XML 文档 :) 当提供相同的文档时,我在评论中引用的那个会产生 XML Error: System.Xml.XmlException: There are multiple root elements. Line 4, position 2. at System.Xml.XmlTextReaderImpl.Throw(Exception e)
  • 检查我的答案,了解在 XPath 1.0 中表达这一点的众所周知且正确的方法

标签: php xpath


【解决方案1】:

这个关于序列的存在性测试的经典 XPath 1.0 答案是:

/html/body//div[
   contains(
      concat(' ',normalize-space(@class),' '),
      ' product-name '
   )
]

【讨论】:

    【解决方案2】:

    你可以使用contains():

    /html/body//div[contains(@class, 'product-name')]
    

    更新:

    正如@Alejandro 在他的评论中指出的那样,这也将匹配任何包含 product-name 的类。 See his answer for a XPath 1.0 solution.

    如果您使用 XPath 2.0,您也可以这样做:

    /html/body//div[exists(index-of(tokenize(@class, "\s+"), "product-name"))]
    

    【讨论】:

    • 不接第二个div,这里也查了emdin-here.ru/r/xpath_checker
    • @OrW:这个解决方案是正确的(根据你的问题)。如果它不适合你,你的问题并不代表你的问题。
    • @OrW:它对我有用。您是否通过了正确的文件?如果您使用上面的确切 XPath,则文档必须包含 htmlbody 节点。或者从路径中删除/html/body,然后重试。
    • @OrW:您提供的 XML 文档无效。 XML 文档总是只有 一个 根节点。将 div 和 &lt;root&gt; 元素或 &lt;html&gt;&lt;body&gt;... 放在一起。
    • @OrW:不客气 :) 老实说,我犯了同样的错误 ;) :D
    【解决方案3】:

    /html/body//div[contains(@class,'product-name')]

    属性也是节点,它们被称为属性节点。

    【讨论】:

    • 由于某种原因,仍然没有拿起product-name gold
    • 请验证您的代码是否正确。 //div 部分正确并符合您的要求。验证不匹配的 div 是 /html/body 的后代。您可以验证此 XPath f.i。在xmlme.com/XpathTool.aspx
    猜你喜欢
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多