SimpleXML Reading node with a hyphenated name

2018-12-31 18:16发布

问题:

I have the following 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>

And am trying to read the office:document-meta node to extractthe various elements below it (dc:creator, meta:creation-date, etc.)

The following code:

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

gives me:

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

but if I try to read the document-meta element using:

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

I get

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

I assume that SimpleXML is trying to extract a non-existent node \"document\" from $officeXML, then subtract the value of (non-existent) constant \"meta\", resulting in forcing the integer 0 result rather than the document-meta node.

Is there a way to resolve this using SimpleXML, or will I be forced to rewrite using XMLReader? Any help appreciated.

回答1:

Your assumption is correct. Use

$officeXML->{\'document-meta\'}

to make it work.

Please note that the above applies to Element nodes. Attribute nodes (those within the @attributes property when dumping the SimpleXmlElement) do not require any special syntax to be accessed when hyphenated. They are regularly accessible via array notation, e.g.

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

See the SimpleXml Basics in the Manual for further examples.



标签: simplexml php