SimpleXML带有连字符名称的读取节点

我有以下XML:

<?xml version="1.0" encoding="UTF-8"?> <gnm:Workbook xmlns:gnm="http://www.gnumeric.org/v10.dtd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.gnumeric.org/v9.xsd"> <office:document-meta xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:ooo="http://openoffice.org/2004/office" office:version="1.1"> <office:meta> <dc:creator>Mark Baker</dc:creator> <dc:date>2010-09-01T22:49:33Z</dc:date> <meta:creation-date>2010-09-01T22:48:39Z</meta:creation-date> <meta:editing-cycles>4</meta:editing-cycles> <meta:editing-duration>PT00H04M20S</meta:editing-duration> <meta:generator>OpenOffice.org/3.1$Win32 OpenOffice.org_project/310m11$Build-9399</meta:generator> </office:meta> </office:document-meta> </gnm:Workbook> 

我试图读取办公室:文档元节点来提取它下面的各种元素(dc:creator,meta:creation-date等)

以下代码:

 $xml = simplexml_load_string($gFileData); $namespacesMeta = $xml->getNamespaces(true); $officeXML = $xml->children($namespacesMeta['office']); var_dump($officeXML); echo '<hr />'; 

给我:

 object(SimpleXMLElement)[91] public 'document-meta' => object(SimpleXMLElement)[93] public '@attributes' => array 'version' => string '1.1' (length=3) public 'meta' => object(SimpleXMLElement)[94] 

但如果我尝试阅读文档元元素使用:

 $xml = simplexml_load_string($gFileData); $namespacesMeta = $xml->getNamespaces(true); $officeXML = $xml->children($namespacesMeta['office']); $docMeta = $officeXML->document-meta; var_dump($docMeta); echo '<hr />'; 

我明白了

 Notice: Use of undefined constant meta - assumed 'meta' in /usr/local/apache/htdocsNewDev/PHPExcel/Classes/PHPExcel/Reader/Gnumeric.php on line 273 int 0 

我假设SimpleXML试图从$ officeXML中提取一个不存在的节点“文档”,然后减去(不存在的)常量“meta”的值,导致强制整数0结果而不是文档元节点。

有没有办法解决这个使用SimpleXML,或者我会被迫重写使用XMLReader? 任何帮助赞赏。

你的假设是正确的。 使用

 $officeXML->{'document-meta'} 

使其工作。

请注意,以上适用于Element节点。 属性节点(在转储SimpleXmlElement时@attributes属性中的属性节点)在连string时不需要任何特殊语法。 他们通常可以通过数组符号来访问,例如

 $xml = <<< XML <root> <hyphenated-element hyphenated-attribute="bar">foo</hyphenated-element> </root> XML; $root = new SimpleXMLElement($xml); echo $root->{'hyphenated-element'}; // prints "foo" echo $root->{'hyphenated-element'}['hyphenated-attribute']; // prints "bar" 

有关更多示例,请参阅本手册中的SimpleXml基础知识 。