2

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 データから名、姓、通り、都市、地域を取得するにはどうすればよいですか? また、ファイルは非常に大きいため、ノード名を取得する際にもパフォーマンスを確認する必要があります。

ありがとう

4

2 に答える 2

3

私はそれをテストする機会がありませんでしたが、これを試してみてください:

$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 はすべてをロードします)。 ここでは、XML を読み取るために使用できる 3 つの手法について詳しく説明します。

ところで、ノードを含む配列が大きくなりすぎた場合は、より定期的に array_unique を実行して (最終的に実行するのではなく)、それをトリミングします。

于 2013-07-10T15:38:47.990 に答える