0

XML でエンティティを使用していますが、結果がわかりません。

外部エンティティを呼び出す XML ファイルがあります。これは config.xml です。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE config [
    <!ENTITY totalInstances SYSTEM "totalInstances.xml">
]>
<config>
    &totalInstances;
</config>

ファイル totalInstances.xml は次のとおりです。

<?xml version="1.0" encoding="UTF-8" ?>
<totalInstances>
    <nombre>45</nombre>
</totalInstances>

PHP では、クラス SimpleXMLElement を使用してファイル config.xml をロードします。

$config = simplexml_load_file('config.xml');

次に、var_dump を使用して変数 $config を出力しましたが、ここに私が理解できないことがあります。

object(SimpleXMLElement)[3]
  public 'totalInstances' => 
    object(SimpleXMLElement)[5]
      public 'totalInstances' => 
        object(SimpleXMLElement)[6]
          public 'totalInstances' => 
            object(SimpleXMLElement)[8]
              public 'nombre' => string '45' (length=2)

ノード「nombre」を含む単純な「totalInstances」ノードがあると予想していました。何が起こるのですか ?ありがとうございます。

edit : 詳細については、ファイル totalInstances.xml に 1 つしかないのに、「totalInstances」という名前のオブジェクトが 3 つある理由がわかりません。私はこの出力を期待していました:

object(SimpleXMLElement)[3]
      public 'totalInstances' => 
            object(SimpleXMLElement)[8]
                public 'nombre' => string '45' (length=2)

また、出力の「[]」の間の数字が何を意味するのかわかりません。

4

1 に答える 1

1

はい、これは本当に奇妙に見えます。ただし、 SimpleXMLElementvar_dumpに対してまたはprint_rを使用することはできません。これらの要素には多くの魔法があり、ここに嘘をついています. 私は本当に嘘をついているという意味です。var_dump

var_dump($config->totalInstances->totalInstances);

SimpleXMLElementはまったく与えられNULLていません。

特定のケースで、ドキュメントSimpleXMLElementを展開されたエンティティとして使用する場合は、LIBXML_NOENTオプション(代替エンティティ)を使用できます。

$config = simplexml_load_file('config.xml', NULL, LIBXML_NOENT);

これにより、エンティティによって表されるエンティティを反復してアクセスすることができます。次にvar_dump、見た目もはるかに良くなります。

class SimpleXMLElement#4 (1) {
  public $totalInstances =>
  class SimpleXMLElement#3 (1) {
    public $nombre =>
    string(2) "45"
  }
}
于 2013-04-20T13:45:54.180 に答える