我有以下xml,我想过滤,只显示来自指定发布者的数据。
<?xml version="1.0"?>
<books>
<book isbn="978-1594489501">
<title>A Thousand Splendid Suns</title>
<author>Khaled Hosseini</author>
<publisher>Riverhead Hardcover</publisher>
<amazon_price>14.27</amazon_price>
</book>
<book isbn="978-1594489587">
<title>The Brief Wondrous Life of Oscar Wao</title>
<author>Junot Diaz</author>
<publisher>AB</publisher>
<amazon_price>14.97</amazon_price>
</book>
<book isbn="978-0545010221">
<title>Harry Potter and the Deathly Hallows</title>
<author>J. K. Rowling</author>
<publisher>AB</publisher>
<amazon_price>19.24</amazon_price>
</book>
</books>
我想在一个html表只从示例出版商AB的数据。
<?php
// load SimpleXML
$books = new SimpleXMLElement("books.xml);
$myVar="AB";
$books = $s->xpath("//book");
echo <<<EOF
<table style='width: 99%;'>
<thead>
<tr>
<th>Title</th>
<th>Author</th>
</tr>
</thead>
EOF;
foreach($books as $book) // loop through our books
{
//if the type of $product books user input (ie $myVar)
if ($book->type == $myVar)
{
echo <<<EOF
<tbody>
<tr>
<td>{$book->title} </td>
<td>{$book->author}</td>
</tr>
EOF;
}}
echo '</tbody>';
echo '</table>';
?>
我得到在非对象上调用成员函数xpath(),请提供任何帮助。
如果您想通过SimpleXMLElement的构造函数从文件加载数据,您必须将第三个参数设置为true
。否则,作为第一个参数传递的字符串将被解释为"原始"xml数据,即
$x = new SimpleXMLELement('<books><book>....</books>');
或
$x = new SimpleXMLELement('books.xml', 0, true);
或
$x = simplexml_load_file('books.xml');
和代码中其他一些错误。例如,您想测试<publisher>
元素中的特定值,但您正在测试if ($book->type == $myVar)
。
在这种情况下,最好将条件放入xpath表达式
<?php
$doc = new SimpleXMLElement("books.xml", 0, true);
$myVar="AB";
$books = $doc->xpath("//book[publisher='$myVar']");
...
您正在调用$s->xpath("//book")
,但$s
似乎不存在。我想你指的是上面这一行:
$s = new SimpleXMLElement("books.xml");
代替
$books = new SimpleXMLElement("books.xml");
,不要忘记结束引号"
("books.xml")