【问题标题】:PHP - very basic XMLReaderPHP - 非常基本的 XMLReader
【发布时间】:2014-04-15 01:05:57
【问题描述】:

因为我将解析一个非常大的 XML 文件,所以我尝试使用 XMLReader 来检索 XML 数据,并使用 simpleXML 来显示。我从来没有使用过 XMLreader,所以我只是想对使用 XMLReader 有一个基本的感觉。我想在 XML 文件中显示所有名称和价格值,但我无法让此代码显示任何内容。我错过了什么吗?

这里是 XMLReader/simpleXML 代码:

$z = new XMLReader;
$z->open('products.xml');
$doc = new DOMDocument;

while ($z->read() && $z->name === 'product') {
$node = simplexml_import_dom($doc->importNode($z->expand(), true));

var_dump($node->name);
$z->next('product');
}

这是 XML 文件,名为 products.xml

<products>

<product category="Desktop">
<name> Desktop 1 (d)</name>
<price>499.99</price>
</product>

<product category="Tablet">
<name>Tablet 1 (t)</name>
<price>1099.99</price>
</product>

</products>

【问题讨论】:

    标签: php xml simplexml xmlreader


    【解决方案1】:

    您的循环条件已损坏。如果你得到一个元素并且元素名称是“product”,你就会循环。文档元素是“products”,所以循环条件永远不会是TRUE

    您必须注意read()next() 正在移动内部光标。如果它位于 &lt;product&gt; 节点上,read() 会将其移动到该节点的第一个子节点。

    $reader = new XMLReader;
    $reader->open($file);
    $dom   = new DOMDocument;
    $xpath = new DOMXpath($dom);
    
    // look for the first product element
    while ($reader->read() && $reader->localName !== 'product') {
      continue;
    }
    
    // while you have an product element
    while ($reader->localName === 'product') {
      $node = $reader->expand($dom);
      var_dump(
        $xpath->evaluate('string(@category)', $node),
        $xpath->evaluate('string(name)', $node),
        $xpath->evaluate('number(price)', $node)
      );
      // move to the next product sibling
      $reader->next('product');
    }
    

    输出:

    string(7) "Desktop"
    string(14) " Desktop 1 (d)"
    float(499.99)
    string(6) "Tablet"
    string(12) "Tablet 1 (t)"
    float(1099.99)
    

    【讨论】:

    • 谢谢!您将我引向了正确的方向 - 足以在 XMLReader 解析 XML 后将 simpleXML 合并到显示结果中。
    • 我更喜欢使用 DOM+XPath。 SimpleXML 的工作量很大。
    • 在处理这个问题时,我相信您对 simpleXML 的工作量太大是正确的。我对编程比较陌生,所以非常感谢您的帮助!
    猜你喜欢
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多