猿问

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

我有以下XML:

<?xml version="1.0" encoding="UTF-8"?><gnm:Workbook xmlns:gnm="http://www.gnumeric.org/v10.dtd" xmlns:xsi=" 
a-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/offi
  ce" 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>

我试着阅读office:Document-meta节点来提取它下面的各种元素(dc:creator,meta:create-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]

但是,如果我尝试使用以下方法读取文档-meta元素:

$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 273int 0

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

是否有一种使用SimpleXML解决此问题的方法,或者我将被迫使用XMLReader重写?任何帮助都很感激。


12345678_0001
浏览 552回答 2
2回答

繁花不似锦

你的假设是正确的。使用$officeXML->{'document-meta'}让它发挥作用。请注意,上述内容适用于元素节点。属性节点(在转储SimpleXmlElement时在@Attribute属性中)不需要在连字符时访问任何特殊语法。它们可以通过数组符号定期访问。$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"

弑天下

注意,连字符元素名称必用引号。如果你说{document-meta},它将无法工作,并将返回整个XML文档。一定是{'document-meta'}..这让我今天早上绊倒了大约两个小时。
随时随地看视频慕课网APP
我要回答