1

PHP で XML 操作をいじり始めたばかりで、予期しないことに遭遇しました。テスト入力として使用している XML は次のとおりです。

<list>
    <activity1> running </activity1>
    <activity2> swimming </activity2>
    <activity3> soccer </activity3>
</list>

今、私はこのPHPコードが「activity1」を出力することを期待していました:

$xmldoc = new DOMDocument();
$xmldoc->load('file.xml');

//the line below would make $root the <list> node
$root = $xmldoc->firstChild;

//the line below would make $cnode the first child 
//of the <list> node, which is <activity1>
$cnode = $root->firstChild;

//this should output 'activity1'
echo 'element name: ' . $cnode->nodeName;

代わりに、このコードは #text を出力します。ノード名を出力する前に、コードに新しい行を挿入することで修正できます。

$cnode = $cnode->nextSibling;

さて、代わりに「activity2」を印刷することを期待していましたが、「activity1」を印刷しています。何が起こっている?

4

4 に答える 4

1

期待どおりの動作を得るには、load() 呼び出しの 2 番目のパラメーターとして LIBXML_NOBLANKS を渡す必要があります。

<?php
$xmldoc = new DOMDocument();
$xmldoc->load('file.xml', LIBXML_NOBLANKS);
?>
于 2008-10-11T01:40:34.567 に答える
1

XPath を使用してドキュメントのクエリを実行する場合は、この種の秘訣について心配する必要はありません。を使用DOMDocument::xpath_eval()してパターンを評価する/list/*と、返されるのは最上位要素の子要素だけですlist

于 2008-10-11T19:40:28.287 に答える
1

最初のノードは開始リスト タグと activity1 タグの間のテキスト (この場合は空白) で、次のノードは activity1要素です。要素はノードと同じではありません。

于 2008-10-11T01:01:15.067 に答える
0

Czimi の回答に関する注意: 空白のみのノードを削除しても、ノードのタイプ (要素、テキスト ノード、コメントなど) を確認する必要はありません。一般に、要素ノードのみを選択することに関心がある場合は、次のようにします。

while($nodeInQuestion->nodeType != 1 && $nodeInQuestion->nextSibling) {
    $nodeInQuestion = $nodeInQuestion->nextSibling;
}

これは一種の疑似コードです。要素を探していて、それを見つける前にparentNodeのchildNodeの最後に到達する場合は、何らかの方法で失敗を処理する必要があることは明らかです。

于 2008-10-11T06:06:27.307 に答える