PHP XMLReader获取所有节点名称

时间:2013-07-10 15:16:05

标签: php xmlreader

如何在XMLReader中获取所有唯一的节点名称?比方说,我有以下XML数据:

<a>
    <b>
        <firstname>John</firstname>
        <lastname>Doe</lastname>
    </b>
    <c>
        <firstname>John</firstname>
        <lastname>Smith</lastname>
        <street>Streetvalue</street>
        <city>NYC</city>
    </c>
    <d>
        <street>Streetvalue</street>
        <city>NYC</city>
        <region>NY</region>
    </d>
</a>

如何使用XMLReader从上面的XML数据中获取名字,姓氏,街道,城市,区域?此外,文件非常大,因此在获取节点名称时也需要查看性能。

由于

2 个答案:

答案 0 :(得分:2)

我没有机会测试它,但尝试一下:

$reader = new XMLReader();
$reader->open($input_file);
$nodeList = array();

while ($reader->read())
{

    // We need to check if we're dealing with an Element
    if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'b')
    {
        // Let's inspect the node's content as well
        while ($reader->read())
        {
            if ($reader->nodeType == XMLReader::ELEMENT)
            {
                 // Saving the node to an auxiliar array
                 array_push($nodeList, $reader->localName);
            }
        }
}

// Finally, let's filter the array
$nodeList = array_unique($nodeList);

性能方面,如果文件很大,那么XMLReader是要走的路,因为它只将当前标记加载到内存中(而另一方面,DOMDocument会加载所有内容)。 Here's a more detailed explanation关于可用于阅读XML的三种技术。

顺便说一句,如果包含节点的数组变得太大,则会更频繁地运行array_unique(而不是仅仅在最后执行),以便修剪它。

答案 1 :(得分:1)

您可以使用simplexml_load_file functionPHP object中加载xml数据。使用simplexml_load_string function

的示例
$xml_string = '<?xml version="1.0" encoding="UTF-8"?>
<a>
    <b>
        <firstname>John</firstname>
        <lastname>Doe</lastname>
    </b>
    <c>
        <firstname>John</firstname>
        <lastname>Smith</lastname>
        <street>Streetvalue</street>
        <city>NYC</city>
    </c>
    <d>
        <street>Streetvalue</street>
        <city>NYC</city>
        <region>NY</region>
    </d>
</a>';

$xml = simplexml_load_string($xml_string);
/* $xml = simplexml_load_file($file_name); */ // Use this to load xml data from file

// Data will be in $xml and you can iterate it like this
foreach ($xml as $x) {
    if (isset($x->firstname)) {
        echo $x->firstname . '<br>'; // $x->lastname, $x->street, $x->city also can be access this way
    }
}