如何读取SimpleXML的大XML节点



谁能帮我读取大文件?我阅读和条目类似:

    $xmlReader = new XMLReader();
    $xmlReader->open($path);
    while ($xmlReader->read() && $xmlReader->name !== 'item') ;
    while ($xmlReader->name == 'item')
    {
      $node = new SimpleXMLElement($xmlReader->readOuterXML());
      foreach($node->properties as $property)
      {
        var_dump($property->price); //empty class SimpleXMLElement
        var_dump($property->attributes()); //empty class SimpleXMLElement
      }
      $xmlReader->next('item');
    }
    $xmlReader->close();

所以我不能读取$property->price,因为我收到空类SimpleXMLElement

与属性sku相同的情况,我也接收空类SimpleXMLElement

和我不能转换(字符串),因为我收到空字符串。

如何读取子节点?源XML:

<items>
            <item>
                <code>be274178-9039-11e6-86d0-001e6727034e</code>
                <delete>0</delete>
                <title>Полотенцесушитель М-обр. 500*500 нар. р. 1" арт.00004-5050</title>
                <category>13760cb9-8f7b-11e6-86d0-001e6727034e</category>
                <producer>5a457cfd-b088-11e2-9c54-001e6727034e</producer>
                <properties>
                    <property sku="40 451">
                        <price>2831.00</price>
                        <characteristics>
                            <characteristic>
                                <title>Свойство</title>
                                <value>накопление</value>
                                <filter>0</filter>
                                <visible>0</visible>
                            </characteristic>
                            <characteristic>
                                <title>Форма</title>
                                <value>М-образный</value>
                                <filter>1</filter>
                                <visible>1</visible>
                            </characteristic>
                        </characteristics>
                    </property>
                    <property sku="40 464">
                        <price>3442.00</price>
                        <characteristics>
                            <characteristic>
                                <title>Свойство</title>
                                <value>накопление</value>
                                <filter>0</filter>
                                <visible>0</visible>
                            </characteristic>
                        </characteristics>
                    </property>
                </properties>
            </item>
        </items>

应该是

foreach($node->properties->property as $property)

因为只有一个<properties>元素,但有很多<property>元素。

参见《PHP手册》中的例#4访问SimpleXML中的非唯一元素:

当一个元素的多个实例作为一个父元素的子元素存在时,应用常规的迭代技术。

<?php
include 'example.php';
$movies = new SimpleXMLElement($xmlstr);
/* For each <character> node, we echo a separate <name>. */
foreach ($movies->movie->characters->character as $character) {
   echo $character->name, ' played by ', $character->actor, PHP_EOL;
}
?>

最新更新