2011-03-14 118 views
2

我有这个div:PHP简单的XPath问题

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

我也有这个div:

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

我怎样才能改变这种XPath查询以获得其包含产品名称什么的div ?而不是获得完全匹配。

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

我GOOGLE了它,但所有我能找到的是如何为一个节点内的值,而不是一个属性搜索时使用contains

编辑 enter image description here

+0

请提供您的源文件。 –

+0

@Alex,您为什么需要查看我提供的资源以外的任何资源? –

+0

有效的XML应该只有一个根节点。用' ..'包好你的div,一切都会好的。 –

回答

1

您可以使用contains()

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

更新:

由于@Alejandro指出了他的意见,这也将匹配任何类,它包含product-nameSee his answer for a XPath 1.0 solution

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

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

不拿起第二个div,也在这里检查http://emdin-here.ru/r/xpath_checker/ –

+0

@ or:这个解决方案是正确的(根据你的问题)。如果它不适合你,你的问题并不代表你的问题。 – Tomalak

+0

@ orr:它​​适合我。你通过正确的文件?如果您使用上述精确的XPath,则文档必须包含'html'和'body'节点。或者从路径中移除'/ html/body'并重试。 –

0

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

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

+0

由于某些原因,仍然无法获取产品名称黄金 –

+0

,请验证您的代码是否正确。 '// div'部分是正确的并且符合您的要求。验证不匹配的div是'/ html/body'的后代。您可以验证此XPath f.i.在http://www.xmlme.com/XpathTool.aspx –

2

经典的XPath 1.0的答案对序列中的这个existencial测试:

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

+1是更强大的解决方案。 –

+0

+1通用方法。 – Flack