SimpleXMLElement:asXML()“在非对象上”,它确实是一个对象

时间:2014-02-11 21:04:19

标签: php xpath svg simplexml

我在PHP中使用SimpleXMLElement解析SVG文件。 SVG文件是在Adobe Illustrator中精心构建的,遵循我试图剖析的图层格式。

考虑以下代码:

// Create an XML object out of the SVG
$svg = new SimpleXMLElement('floorplan.svg', null, true);

// Register the SVG namespace
$svg->registerXPathNamespace('svg', 'http://www.w3.org/2000/svg');

// Get the normal floorplan layer
$normal = $svg->xpath('svg:g[@id="Normal"]');

// If the normal layer has content, continue
if(count($normal) > 0) {
  // If there are floors, continue
  if(count($normal[0]->g > 0)) {
    // Loop through each floor
    foreach($normal[0]->g as $floor) {
      // Declare the namespace for the floor
      $floor->registerXPathNamespace('svg', 'http://www.w3.org/2000/svg');

      // Select the base floorplan
      $floorsvg = $floor->xpath('svg:g[@id="Base"]')[0];

      var_dump($floorsvg);
      echo $floorsvg->asXML();  // THIS CAUSES THE ERROR
    }
  }
}

当我在var_dump上执行$floorsvg时,它声明它是一个SimpleXMLElement对象:

object(SimpleXMLElement)[9]
  public '@attributes' => 
    array (size=1)
      'id' => string 'Base' (length=4)
  public 'g' => 
    array (size=859)
      0 => ...

但是,当我在对象上运行asXML()时,会出现以下PHP错误:

  

PHP致命错误:在非对象

上调用成员函数asXML()

我不确定为什么asXML()失败,因为它是一个对象。任何人都可以解释为什么会出现这个问题,以及我可能会尝试解决这个问题吗?

编辑:在上面添加echo $normal->asXML();会产生同样的错误。似乎xpath导致对象以某种方式变形。

编辑2:可以在此处查看正在解析的SVG文件:http://pastebin.com/zK1yRFA7

1 个答案:

答案 0 :(得分:1)

有一些问题。您的代码假定:

$floor->xpath('svg:g[@id="Base"]')

将返回至少包含1个元素的数组。 <g id="Second_Floor">元素不包含将与该XPath表达式匹配的任何子元素,因此尝试访问空数组的元素0将会给出您看到的错误。

添加一个简单的保护表达式:

// Select the base floorplan
$floorsvg = $floor->xpath('svg:g[@id="Base"]')

if (count($floorsvg) > 0) {
    echo $floorsvg[0]->asXML();
}

将解决这个问题。其次,你在这一行中有一些错位的括号:

if(count($normal[0]->g > 0)) {

应该是:

if(count($normal[0]->g) > 0) {

似乎只是一个简单的拼写错误,似乎不会以某种方式影响这个特定脚本的结果。