2010-09-02 35 views
20

Tôi có XML sau:SimpleXML Reading nút với một tên hyphenated

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

Và đang cố gắng để đọc văn phòng: Tài liệu-meta nút để extractthe yếu tố khác nhau dưới nó (dc: creator, meta: creation- ngày, vv)

Các mã sau đây:

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

mang lại cho tôi:

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

nhưng nếu tôi cố gắng đọc các yếu tố tài liệu-meta sử dụng:

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

tôi nhận được

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

tôi cho rằng SimpleXML đang cố gắng để trích xuất một nút "tài liệu" không tồn tại từ $ officeXML, sau đó trừ giá trị của hằng số (không tồn tại) "meta", dẫn đến buộc kết quả số nguyên 0 chứ không phải là nút meta tài liệu.

Có cách nào để giải quyết vấn đề này bằng SimpleXML hay tôi sẽ bị buộc viết lại bằng XMLReader? Bất kỳ trợ giúp nào được đánh giá cao.

+1

bản sao có thể có của [PHP: Làm cách nào để truy cập thuộc tính đối tượng này?] (Http://stackoverflow.com/questions/758449/php-how-do-i-access-this-object-property) –

Trả lời

36

Giả định của bạn là chính xác. Sử dụng

$officeXML->{'document-meta'} 

để làm cho nó hoạt động.

Xin lưu ý rằng các điều trên áp dụng cho nút Yếu tố. Các nút thuộc tính (các thuộc tính trong thuộc tính @attributes khi bán phá giá SimpleXmlElement) không yêu cầu bất kỳ cú pháp đặc biệt nào được truy cập khi được gạch nối. Chúng thường xuyên có thể truy cập thông qua ký hiệu mảng, ví dụ:

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

Xem SimpleXml Basics in the Manual để biết thêm ví dụ.

+0

didn ' t làm việc cho tôi tôi đã có lúc @ dấu hiệu thats effin nó tất cả lên –

+0

Cảm ơn bạn, điều này đã được cho tôi đau đầu –

+0

Phiên bản nào của PHP được reqiured để sử dụng ký hiệu này? –

Các vấn đề liên quan