XPath - 包含函数

时间:2014-02-04 12:10:09

标签: php xml xpath

我正在使用PHP和Xpath来搜索匹配或部分匹配的XML文件中的数据  任何名称元素中的文本字符串。这是XML文件,名为products.xml:

<products>

<product type="Electronics">
<name>Desktop</name>
<price>499.99</price>
<store>Best Buy</store>
</product>

<product type="Hardware">
<name>Hand Saw</name>
<price>99.99</price>
<store>Lowes</store>
</product>

</products>

这是PHP和XPath代码,它利用contains()函数在XML文件中的任何名称元素中搜索匹配或部分匹配的文本到文本字符串“Desk”:

$xmldoc = simplexml_load_file("products.xml");
$query = $xmldoc->xpath('/products/product/name[contains(text(),"Desk")]'); 
foreach($query as $Products) 
{
echo $Products->name . " ";
echo $Products->price . "<br>";
}

什么都没有显示!任何意见是极大的赞赏!谢谢!

3 个答案:

答案 0 :(得分:2)

选择器当前为/name之前的最后一个路径组件,您需要构建/product的路径,然后使用选择器过滤name

更改

$query = $xmldoc->xpath('/products/product/name[contains(text(),"Desk")]'); 

$query = $xmldoc->xpath('/products/product[contains(name,"Desk")]');

区别在于您的$ query包含“name”元素,而不是您想要的“product”元素。

答案 1 :(得分:0)

尝试使用var_dump()函数检查循环中的$ Products变量:

foreach($query as $Products) 
{
  var_dump( $Products );
  echo $Products->name . " ";
  echo $Products->price . "<br>";
}

您会看到$ Products没有name属性。这对我有用:

foreach($query as $Products) 
{
  echo $Products[0];
}

答案 2 :(得分:0)

或另一种解决方案是使用getElementsByTagName

<?php
$XML='<products>

<product type="Electronics">
<name>Desktop</name>
<price>499.99</price>
<store>Best Buy</store>
</product>

<product type="Hardware">
<name>Hand Saw</name>
<price>99.99</price>
<store>Lowes</store>
</product>

</products>
';
$xmldoc = new DOMDocument;
$xmldoc->loadXML($XML);
echo $xmldoc->getElementsByTagName('name')->item(0)->nodeValue;
?>

这应该适合你。