如何在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数据中获取名字,姓氏,街道,城市,区域?此外,文件非常大,因此在获取节点名称时也需要查看性能。
由于
答案 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 function
在PHP 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
}
}