不理解XML实体和PHP SimpleXMLElement中的输出

时间:2013-04-20 11:05:45

标签: php xml simplexml xml-entities

我在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中我在Class 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)

我希望有一个简单的“totalInstances”节点,其中包含节点“nombre”。 怎么了 ? 谢谢你。

编辑:有关详细信息,我不明白为什么我得到三个名为“totalInstances”的对象,而totalInstances.xml文件中只有一个对象?我希望有这个输出:

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

另外,我不确定输出中“[]”之间的数字是什么意思。

1 个答案:

答案 0 :(得分:1)

是的,这确实看起来很奇怪。但是,您无法在 SimpleXMLElement 上使用var_dumpprint_r。这些元素有很多魔力,而 var_dump 在这里对你说谎。我的意思是说谎,见:

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

正在提供NULL而没有 SimpleXMLElement

在您的特定情况下,如果您希望将文档用作扩展实体的 SimpleXMLElement ,那么您可以使用LIBXML_NOENT option(替换实体):< / p>

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

这允许迭代并访问由实体/ ies表示的实体。 var_dump看起来也好多了:

class SimpleXMLElement#4 (1) {
  public $totalInstances =>
  class SimpleXMLElement#3 (1) {
    public $nombre =>
    string(2) "45"
  }
}