SimpleXMLオブジェクトのセットを反復処理していますが、各オブジェクトの親ノードにアクセスする方法がわかりません。これが私が欲しいものです:
$divs = simplexml->xpath("//div");
foreach ($divs as $div)
{
$parent_div = $div->get_parent_node(); // Sadly, there's no such function.
}
これを行うにはかなり簡単な方法があるに違いないようです。
単純なXPathクエリを実行して取得できます。
$parent_div = $div->xpath("parent::*");
また、これはSimplexmlであり、要素ノードと属性ノードのみがあり、親ノードは要素のみであり、属性ではないため、省略構文を使用できます。
$parent_div = $div->xpath("..");
(via: Common Xpath Cheats-SimpleXML Type Cheatsheet(Feb 2013; by hakre) )
$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();
_
メモリが機能する場合、xpath()
呼び出しは1つ以上のSimpleXMLElements
を返します。その場合は、次のようなものを使用できる可能性があります。
$div->xpath( '..' );
# or
$div->xpath( 'parent::*' );