PHP XMLReader 获取所有节点名称
Posted
技术标签:
【中文标题】PHP XMLReader 获取所有节点名称【英文标题】:PHP XMLReader get all node names 【发布时间】:2013-07-08 14:34:27 【问题描述】:如何获取 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 数据中获取名字、姓氏、街道、城市、地区?而且文件很大,所以在获取节点名称时还需要查看性能。
谢谢
【问题讨论】:
【参考方案1】:我没有机会测试它,但请尝试一下:
$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(而不是最后才这样做),以便修剪它。
【讨论】:
太好了,谢谢!您知道如何获取仅在某个特定节点下的节点名称吗?示例仅在<b>
下,但<b>
出现多次。
不,它只会打印b
.. 预期输出是firstname
,lastname
。特定节点下的所有节点名称。
重新编辑。现在呢?无论如何,这就是理论,你想要的节点内的另一个循环
没问题,很乐意帮忙。【参考方案2】:
您可以使用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
【讨论】:
以上是关于PHP XMLReader 获取所有节点名称的主要内容,如果未能解决你的问题,请参考以下文章
PHP XMLReader 读取、编辑节点、编写 XMLWriter
如何在 XMLReader 中获取标记名称的值 + 如何使用该值进行进一步分析