2010-09-02 56 views
20

我有下面的XML:有複姓的SimpleXML讀節點

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

,我試圖讀取辦公:文件的元節點extractthe下方(DC各種要素:創造者,薈萃:creation-日期等)

下面的代碼:

$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,然後減去(不存在)常量「元」的值,導致強制整數0結果而不是文檔元節點。

有沒有辦法解決這個使用SimpleXML,或者我會被迫重寫使用XMLReader?任何幫助讚賞。

+1

可能重複[PHP:如何訪問此對象屬性?](http://stackoverflow.com/questions/758449/php-how-do-i-access-this-object-property) – 2010-09-02 14:01:54

回答

36

你的假設是正確的。使用

$officeXML->{'document-meta'} 

使其工作。

請注意,上述內容適用於Element節點。屬性節點(在轉儲SimpleXmlElement時@attributes屬性中的屬性節點)在連字符串時不需要任何特殊語法。它們可以通過數組符號定期訪問,例如,

$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 Basics in the Manual作爲進一步的例子。

+0

didn' t爲我工作我已經在@ sign thats effin這一切 – 2011-05-25 23:54:59

+0

謝謝,這一直讓我頭疼 – 2014-10-18 00:32:21

+0

什麼版本的PHP需要重新使用這種表示法? – 2014-11-27 19:58:20