web-dev-qa-db-ja.com

PHPのSimpleXMLを使用して要素の親にアクセスしますか?

SimpleXMLオブジェクトのセットを反復処理していますが、各オブジェクトの親ノードにアクセスする方法がわかりません。これが私が欲しいものです:

$divs = simplexml->xpath("//div");
foreach ($divs as $div)
{
   $parent_div = $div->get_parent_node(); // Sadly, there's no such function.
}

これを行うにはかなり簡単な方法があるに違いないようです。

21
thisismyname

単純なXPathクエリを実行して取得できます。

$parent_div = $div->xpath("parent::*");

また、これはSimplexmlであり、要素ノードと属性ノードのみがあり、親ノードは要素のみであり、属性ではないため、省略構文を使用できます。

$parent_div = $div->xpath("..");

(via: Common Xpath Cheats-SimpleXML Type Cheatsheet(Feb 2013; by hakre)

37
nickf

$div->get_parent_node(); // Sadly, there's no such function.

SimpleXMLを拡張してそのようにすることができることに注意してください。例えば:

_class my_xml extends SimpleXMLElement
{
    public function get_parent_node()
    {
        return current($this->xpath('parent::*'));
    }
}
_

そして今、あなたがしなければならないのは、最初にSimpleXMLElementを作成するために使用するコードを変更することです。

_$foo = new SimpleXMLElement('<foo/>');
// becomes
$foo = new my_xml('<foo/>');

$foo = simplexml_load_string('<foo/>');
// becomes
$foo = simplexml_load_string('<foo/>', 'my_xml');

$foo = simplexml_load_file('foo.xml');
// becomes
$foo = simplexml_load_file('foo.xml', 'my_xml');
_

最良の部分は、SimpleXMLがこのドキュメントの_my_xml_オブジェクトを自動的かつ透過的に返すため、他に何も変更する必要がないため、get_parent_node()メソッドをチェーン可能にすることです。

_// returns $grandchild's parent's parent
$grandchild->get_parent_node()->get_parent_node();
_
20
Josh Davis

メモリが機能する場合、xpath()呼び出しは1つ以上のSimpleXMLElementsを返します。その場合は、次のようなものを使用できる可能性があります。

$div->xpath( '..' );
# or
$div->xpath( 'parent::*' );
6
Rob Wilkerson