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(而不是最后才这样做),以便修剪它。

【讨论】:

太好了,谢谢!您知道如何获取仅在某个特定节点下的节点名称吗?示例仅在&lt;b&gt; 下,但&lt;b&gt; 出现多次。 不,它只会打印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

使用 PHP XMLReader 检测 XML 自闭标签

如何在 XMLReader 中获取标记名称的值 + 如何使用该值进行进一步分析

如何使用 xpath/php 获取 xml 文件中的节点名称?

使用 PHP 和 XMLReader 解析 XML

php xml 文件读取 XMLReader