2013-05-03 64 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。