2

私はPHPの初心者ですが、ここで何が欠けているのかわかりません。XPathを使用してXMLファイルから作成した多次元配列があります。配列内を移動してほとんどすべての値を取得できますが、1つのセクションでスタックしています。

XML構造の例:

  • MasterNode
    • SubNodeItem1
    • SubNodeItem2
    • SubNodeItem3
    • SubNodeItemList
      • SubListItem
        • SubItemProperty1
        • SubItemProperty2
        • SubItemProperty3
      • SubItemList
        • SubItemProperty1
        • SubItemProperty2
        • SubItemProperty3
    • SubNodeItem4
    • SubNodeItem5

次の構文を使用して、任意のサブノード値の値を取得できます。

$val=$XML[$i]->SubNodeItem1;

しかし、私は一生の間、の値を取得する方法を理解することはできませんSubListItemProperty

これが論理構文になると思いました:

$SubItemPropVal=$XML[$i]->SubNodeItemList->SubListItem[$i]->SubItemProperty1;

PHPマルチアレイに関連する他のフォーラムやトピックを検索しましたが、これを行うための適切な方法を見つけることができませんでした。

"Trying to get property of non-object"コードを実行するとエラーが発生します。これは、ノードを正しく指し示していないことを示していると確信しています。

4

1 に答える 1

1

私の推奨は、XMLファイルを保持することです。これは、すでに正常に機能しているようですが、それを使用することをお勧めします。

その要素を配列に転送することは、私にはあまり意味がありません。

編集:OPは実際には配列を使用しませんが、SimpleXMLオブジェクトを使用します。

XPathは、XMLドキュメントから必要なビットを選択する際に非常に柔軟で強力です。

$doc = new DOMDocument();
$doc->loadXML($your_xml);

$xp = new DOMXPath($doc);

// for example
$result = $xp->query("//SubListItem[2]/SubItemProperty1");

if ($result->length)
{
    echo $result->item(0)->textContent;
}

SimpleXMLも機能します。

$xml = simplexml_load_string($result);

// either this ($node will be an array of matches, or FALSE)
$node = $xml->xpath("//SubNodeItemList/SubListItem[1]/SubItemProperty1");

// or this (unless you add a number, [0] will be assumed)
$node = $xml->SubNodeItemList->SubListItem->SubItemProperty1;

重要:配列表記はからカウントされます0が、XPathは常にからカウントされ1ます。

2番目のオプション(配列表記)は、ドキュメントの構造がコードで期待されているものと異なる場合に実行時エラーをスローすることに注意してください。

XPathを使用すると、戻り値がないため、処理が簡単になります(try / catchブロックは不要で、if ($node) { ... }十分です)。

<MasterNode>SimpleXMLでは、ドキュメント要素( )ドキュメントになることにも注意してください。したがって、は使用しません$xml->MasterNode->SubNodeItemListが、$xml->SubNodeItemList

于 2012-12-13T17:38:14.343 に答える