我在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
答案 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) {
似乎只是一个简单的拼写错误,似乎不会以某种方式影响这个特定脚本的结果。