2

SimpleXMLIteratorを使用してXMLを解析しています。print_rを実行すると、XMLから作成されたSimpleXMLIteratorオブジェクトは次のようになります。{

[@attributes] => Array
    (
        [id] => abc
        [type] => a
        [timestamp] => 2001-12-12
    )

[place] => US
[name] => Pete
[dob] => SimpleXMLIterator Object
    (
        [dd] => 03
        [mm] => 05
        [yyyy] => 1973
    )

}

これには、dob SimpleXMLIteratorオブジェクト(つまり、XMLタグの子要素)も含まれています。

次のコードを使用してこのオブジェクトを反復処理します。これは、各XMLタグの深さがわからないため、繰り返し実行されます。

function _prepareSimpleXMLIteratorObj(SimpleXMLIterator $xmlIterator) {

foreach ($xmlIterator as $key => $value){
    // Count returns the number of children
    if ($value->count() > 0) {      
        $this->_prepareSimpleXMLIteratorObj($value);
    } else {
        $this->assocArray[$key] = (string)$value;
    }
}
}

assocArrayは、クラスのメンバー変数です。これにより、オブジェクトから連想配列が生成されます。

問題は、$ value-> count()の代わりに$ value-> hasChildren()を使用すると、$ value-> count()がdobに対して3を返しても、falseになることです。私が間違っていることについて何か考えはありますか?また、もしそうなら

if (($value instanceof SimpleXMLIterator))

dobは明らかにSimpleXMLIteratorオブジェクトですが、falseになりますか?

この方法は機能しますが、hasChildrenとinstanceofについて疑問に思っていますか?

これがサンプルXMLです

<tag id="abc" type="a" timestamp="2001-12-12">
    <place>US</place>
    <name>Pete</name>
    <dob>
        <dd>03</dd>
        <mm>05</mm>
        <yyyy>1973</yyyy>
    </dob>
</tag>

ありがとう

4

1 に答える 1

3

hasChildrenメソッドは、あなたが思っていることをしていないので、あなたのために機能していません。重要なのは、ドキュメントの次の行です。

このメソッドは、現在のSimpleXMLIterator要素にサブ要素があるかどうかを確認します。

「current」と表示されている場合は、foreachで反復処理しているかのように、 current()関数によって返される実際のSimpleXMLElementを意味します。SimpleXMLIteratorは「イテレータ」として設計されていることを忘れないでください

したがって、アルゴリズムがdobノードに到達し、$ value-> hasChildren()を呼び出すと、アイテム$ value-> current()に子があるかどうかが実際にチェックされます。したがって、あなたの例では、ノード/ tag / dob / ddに子があるかどうかをチェックしますが、子はありません。

于 2013-02-06T16:14:54.537 に答える