带过滤器的XML转换为PHP


xml to php with filter

我有以下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")