5

SimpleXMLElement::__construct()メソッドおよび関連する関数simplexml_load_string()およびsimplexml_load_file()すべてには、XML 名前空間に関連するオプションのパラメーターのペアがあります:$nsおよび$is_prefix.

それらが XML 名前空間に関連していることはわかりますが、それらが何のためにあり、どのように機能するのか疑問に思っています。

4

1 に答える 1

6

PHP のマニュアルによると、これら 2 つのパラメーターは PHP バージョン 5.2 で追加されました。公式の PHP 5 変更ログにはこれらの変更が明示的に記載されていませんが、PHP 5.2 更新の readme にはこれらの変更が含まれています。

次に、コンストラクターの 5.2 ソース ( lxr 内) を調べると、これがイテレーターに関連していることがわかります。

sxe->iter.nsprefix = ns_len ? xmlStrdup((xmlChar *)ns) : NULL;
sxe->iter.isprefix = isprefix;

SimpleXMLElementしたがって、これら 2 つは、デフォルトで繰り返されるXML 名前空間を指定すると仮定します。ちょっとしたテストでこれを確認できます:

$xml = new SimpleXMLElement(
    '<root><a/><b/><c/></root>'
);

var_dump(count(iterator_to_array($xml))); #int(3)

デフォルトでは、反復子には a、b、c の 3 つの要素があります。ここで、反復をデフォルトのものとは異なる XML 名前空間で行うように指定するパラメーターを設定すると、次のように変更されます。

$xml = new SimpleXMLElement(
    '<root><a/><b/><c/></root>', 0, FALSE, "ns:1"
);

var_dump(count(iterator_to_array($xml))); #int(0)

root-element には URI の名前空間に child-element がないため、反復の要素はゼロになりましたns:1

ルート要素の名前空間を に変更するns:1と、再び 3 つの要素が表示されます。これは、これらの 3 つの子要素がその名前空間にあり、親から継承するためです。

$xml = new SimpleXMLElement(
    '<root xmlns="ns:1"><a/><b/><c/></root>', 0, FALSE, "ns:1"
);

var_dump(count(iterator_to_array($xml))); #int(3)

子自体が、そのパラメーター ペアとこれらの要素のプレフィックスによって指定された名前空間にある場合と同じです。

$xml = new SimpleXMLElement(
    '<root xmlns:n="ns:1"><n:a/><n:b/><n:c/></root>', 0, FALSE, "ns:1"
);

var_dump(count(iterator_to_array($xml))); #int(3)
于 2013-06-23T08:18:28.597 に答える