3

XMLReader メソッドを使用して XML ファイルを解析しているときに、要素の親ノードを取得するにはどうすればよいですか?

$xml = new XMLReader();
$xml->XML($xmlString);
while($xml->read())
{

$xml->localName; // gives tag name
$xml->value; // gives tag value

// how do I access the parent of this element 
}
4

3 に答える 3

11

短いバージョン: 少なくとも直接ではありません。XMLReader を使用して構文解析アルゴリズムにコンテキストをコーディングするのは、プログラマ次第です。

詳細バージョン: PHP の XMLReader は、プル パーサーと呼ばれるものです。プル パーサーは、テキスト ストリームを処理できるという点で、ツリー/DOM ベースのパーサーとは異なります。つまり、ドキュメント全体を取得する前に、ドキュメントの解析を開始できます。これは、何かを行う前にドキュメント全体をメモリにロードする必要がある SimpleXML や DOMDocument などのツリー ベース/DOM パーサーとは異なります。

利点は、75MB の XML ファイルがある場合、それを処理するために 75MB の空き RAM を必要としないことです (ツリー ベースのパーサーの場合のように)。トレードオフは、プル パーサーがドキュメント全体のコンテキストを保持しないことです。現時点でたまたま処理しているノードのコンテキストしかありません。

これを別の方法で考えると、ツリー/DOM ベースのパーサーは、ドキュメントのすべての部分を把握する必要があります。しかし、あなたとプル パーサーは異なる取り決めを行いました。それはあなたにノードを投げ続け、その内容を処理するためにあなたに任せます。

これは、(うまくいけば)あなたが求めているものに近いコードの例です。

$xml = new XMLReader(); 
$xml->open('example.xml');
$last_node_at_depth = array();
while($xml->read())
{               
    //stash the XML of the entire node in an array indexed by depth
    //you're probably better off stashing exactly what you need from
    $last_node_at_depth[$xml->depth] = $xml->readOuterXML();

    $xml->localName; // gives tag name
    $xml->value;     // gives tag value     

    //so, right now we're at depth n in the XML document.  depth n-1 
    //would be our parent node
    if ($xml->depth > 0) {
        //gives the fragment that starts with the parent node       
        $last_node_at_depth[($xml->depth-1)];   
    }
}
于 2009-02-05T04:00:28.673 に答える
1

XMLReader の expand() 関数を使い始めました。現在の xml タグの DOM 表現を提供します。親ノードで expand() を使用すると、親タグの DOM 要素が得られ、通常の DOMDocument() 解析方法を使用して子の値が抽出されました。

//usage
$xml = new XMLReader();
$xml = $xml->XML($xmlResponse);
while($xml->read())
{
$parent = $xml->expand();

$firstChildValue = $parent->getElementsByTagName('child')->item(0)->nodeValue;
}

expand 関数を使用すると、XML 全体をメモリにロードするのではなく、XML のその部分のみをメモリにロードします。

于 2009-02-06T08:00:42.663 に答える
0

私はあなたが欲しいと思う: XMLReader::moveToElement

于 2009-02-04T23:07:59.903 に答える