如何编辑我的代码以回显在XMLReader中找到我的搜索词的子元素的数据?

时间:2011-07-21 12:09:42

标签: php xml xmlreader

我是XMLReader的新手,我觉得很难找到教程/代码或者先进的东西来获取示例。 我的问题是我如何转换现在的代码,所以如果我搜索(通过表单),jQuery这个术语将让我有机会在每个{{<info></info>(以及后来的其他元素)中输出值{{} 1}}在?

中找到

这是输出图书名称的代码。

<name></name>

xml文件

<?php
$reader = new XMLReader();
$reader->open("books.xml");
while ($reader->read()) {
   switch ($reader->nodeType) {
   case (XMLREADER::ELEMENT):

                  if ($reader->localName == "name") {
                     $reader->read();
                     echo $reader->value;
                     break;
                  }}}
?>

2 个答案:

答案 0 :(得分:0)

尝试simplexml - 最好:

<?php
$books  = simplexml_load_file('books.xml');
$search = 'jquery';
foreach ($books->book as $book) {
    if (preg_match('/' . preg_quote($search) . '/i', $book->name)) {
        echo $book->name . ' (' . $book->info . ')<br/>';
    }
}

答案 1 :(得分:0)

如果你被绑定到XMLReader进行顺序解析,那么你可以基于它构建一些解析器。

简化解析操作的一种方法是将其封装到迭代器中,尤其是在处理序列时。例如,对于名为XMLBookIterator的迭代器,您只需foreach覆盖所有书籍,而正在分析数据:

$books = new XMLBookIterator($file);

foreach($books as $key => $book)
{
    echo 'book (', $key, '):', "\n";
    print_r($book);
}

结果可能与您的示例数据一样:

book (0):
stdClass Object
(
    [isbn] => 781
    [name] => SCJP 1.5
    [info] => Sun Certified Java Programmer book
)
book (1):
stdClass Object
(
    [isbn] => 194
    [name] => jQuery is Awesome!
    [info] => jQuery Reference Book
)
book (2):
stdClass Object
(
    [isbn] => 199
    [name] => jQuery 101
    [info] => All you need to know about jQuery
)

然后,它只会根据您的条款过滤书籍。这可以实现为FilterIterator,我们称之为BookFilterIterator

$filtered = new BookFilterIterator($books, 'jQuery');

foreach($filtered as $key => $book)
{
    echo 'book (', $key, '):', "\n";
    print_r($book);
}

然后输出将减少到匹配的书籍:

book (1):
stdClass Object
(
    [isbn] => 194
    [name] => jQuery is Awesome!
    [info] => jQuery Reference Book
)
book (2):
stdClass Object
(
    [isbn] => 199
    [name] => jQuery 101
    [info] => All you need to know about jQuery
)

唯一剩下的就是执行此操作的实际代码。它有点长,在它的核心 - 迭代器内部的next()函数,你会发现一个基于状态的解析器正在读取你已经在问题中开始的XML。不同的是,它具有某种状态,有助于填充当前的书籍条目,该条目存储为该类的私人成员。

CodeDemo

演示代码使用XML作为字符串,然后通过$file = 'data://text/plain;base64,'.base64_encode($xml);将其转换为伪“文件”。迭代器适用于任何文件名,它只是传递给XMLReader,所以对于大数据,请使用文件。