2010-09-02 13 views
20

tengo el siguiente código XML:nodo SimpleXML de lectura con un apellido compuesto

<?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> 

Y estoy tratando de leer la oficina: Documento-meta nodo a extractthe diversos elementos por debajo de ella (dc: creator, meta: creación- fecha, etc.)

El siguiente código:

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

me da:

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

pero si trato de leer el elemento de documento meta usando:

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

me sale

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

Asumo que SimpleXML está tratando de extraer un nodo "documento" inexistente desde $ officeXML, resta el valor de la constante (inexistente) "meta", lo que da como resultado forzar el resultado 0 entero en lugar del nodo documento-meta.

¿Hay alguna manera de resolver esto usando SimpleXML, o me veré forzado a reescribir usando XMLReader? Cualquier ayuda apreciada.

+1

posible duplicado de [PHP: ¿Cómo accedo a esta propiedad del objeto?] (Http://stackoverflow.com/questions/758449/php-how-do-i-access-this-object-property) –

Respuesta

36

Su suposición es correcta. Utilice

$officeXML->{'document-meta'} 

para que funcione.

Tenga en cuenta que lo anterior se aplica a los nodos Elemento. Los nodos de atributo (aquellos dentro de la propiedad @attributes cuando se descarga SimpleXmlElement) no requieren que se acceda a ninguna sintaxis especial cuando se dividen en guiones. Se puede acceder de forma regular mediante notación de matriz, p.

$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" 

Consulte el SimpleXml Basics in the Manual para obtener más ejemplos.

+0

didn ' t trabajo para mí, tengo en @ sign eso es todo. –

+0

Gracias, esto me ha estado dando dolores de cabeza –

+0

¿Qué versión de PHP se requiere para usar esta notación? –

Cuestiones relacionadas