我正在使用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>";
}
什么都没有显示!任何意见是极大的赞赏!谢谢!
答案 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;
?>
这应该适合你。