2013-05-03 127 views
1

我想打開一個Word 2007文檔(docx),我先後解壓,但我遇到了代碼的xPath部分問題。我想迭代每個元素並獲取元素中的文本。PHP xPath docx解析

在當前示例中,我試圖獲取第一個元素的文本以適應xPath系統。

document.xml中

<w:document> 
    <w:body> 
     <w:p> 
      <w:r> 
       <w:t>Testing</w:t> 
      </w:r> 
     </w:p> 
    </w:body> 
</w:document> 

PHP

$dom = new DOMDocument(); 
$dom->loadXML($string); 
$xpath = new DomXPath($dom); 
$textNodes = $xpath->query("/w:document/w:body/w:p[1]/w:r[1]/w:t[1]"); 
var_dump($textNodes->item(1)->textContent); 
+0

如果設置一個變量,然後檢查下一行,如果它是set =沒必要。還要考慮將代碼從提取zip文件與執行XML解析中分離出來。這絕不能在一個地方。此外,您的問題對於更多在這裏進行解壓縮的用戶來說會更有意義。 – hakre 2013-05-03 16:57:15

+0

另外,在提出一個普遍問題之前(比如描述一個故事的長描述是什麼以及什麼不是等等),首先檢查錯誤消息。給出具體的信息出了什麼問題。我給你留個答案來表明這一點。 – hakre 2013-05-03 17:00:38

+1

考慮給https://github.com/PHPOffice/PHPWord一個嘗試。它可能使事情變得更容易,因爲它專門針對Word。 – Gordon 2013-05-03 17:29:28

回答

2

所以我認爲缺少的命名空間只是因爲縮寫的例子xml。 原始文檔將提供名稱空間。 如果這是真的xpath查詢將工作。 這裏的問題是,該查詢是一個DOMNodeList。 var_dump感覺不起作用。 您可以使用類似:

$textNodes = $xpath->query("/w:document/w:body/w:p[1]/w:r[1]/w:t[1]"); 
foreach ($textNodes as $entry) { 
echo "node: {$entry->nodeName}," . 
    "value: {$entry->nodeValue}\n"; 
} 

能產生這種輸出(添加命名空間到你的XML輸入後):

node: w:t,value: Testing 
+0

**所以我認爲缺少的命名空間只是因爲縮寫的例子xml。** 你是對的。 – Anderson 2013-05-05 11:54:09

+0

謝謝,這正是我期待的@ hr_117 – Anderson 2013-05-05 11:58:14

0

你已經得到了無效的XPath查詢需要被固定的,因爲一個無效的XPath查詢總是會導致錯誤。你不能使用它的結果來獲取節點。

不幸的是,xpath查詢無效,因爲XML無效。所以你不能使用xpath查詢(或者進一步測試它/繼續編寫它)而不先修復XML。

從您在問題中提供的XML中,顯然缺少w-prefix的名稱空間聲明。

您需要啓用最高級別的錯誤報告(E_ALL),顯示開發環境中的錯誤以及錯誤日誌記錄。然後,您可以按照錯誤日誌:

Warning: DOMDocument::loadXML(): Namespace prefix w on document is not defined in Entity, line: 1 in /tmp/execpad-1d8a88cab4fd/source-1d8a88cab4fd on line 15 

Warning: DOMDocument::loadXML(): Namespace prefix w on body is not defined in Entity, line: 2 in /tmp/execpad-1d8a88cab4fd/source-1d8a88cab4fd on line 15 

Warning: DOMDocument::loadXML(): Namespace prefix w on p is not defined in Entity, line: 3 in /tmp/execpad-1d8a88cab4fd/source-1d8a88cab4fd on line 15 

Warning: DOMDocument::loadXML(): Namespace prefix w on r is not defined in Entity, line: 4 in /tmp/execpad-1d8a88cab4fd/source-1d8a88cab4fd on line 15 

Warning: DOMDocument::loadXML(): Namespace prefix w on t is not defined in Entity, line: 5 in /tmp/execpad-1d8a88cab4fd/source-1d8a88cab4fd on line 15 

Warning: DOMXPath::query(): Undefined namespace prefix in /tmp/execpad-1d8a88cab4fd/source-1d8a88cab4fd on line 17 

Warning: DOMXPath::query(): Invalid expression in /tmp/execpad-1d8a88cab4fd/source-1d8a88cab4fd on line 17 

Fatal error: Call to a member function item() on a non-object in /tmp/execpad-1d8a88cab4fd/source-1d8a88cab4fd on line 18 

由於這些節目,也有很多問題,這到底呈現XPath查詢無效,最後把你的整個腳本制止XML。