PHP xPath docx parsing
本问题已经有最佳答案,请猛点这里访问。
我试图打开一个Word 2007文档(docx),我连续解压缩但我遇到了代码的xPath部分的问题。 我想迭代每个元素并获取元素中的文本。
在下面的当前示例中,我试图让第一个元素的文本习惯于xPath系统。
document.xml中
1 2 3 4 5 6 7 8 9 | <w:document> <w:body> <w:p> <w:r> <w:t>Testing</w:t> </w:r> </w:p> </w:body> </w:document> |
PHP
1 2 3 4 5 | $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); |
所以我假设缺少的命名空间只是因为缩短了xml的例子。
原始文档将提供命名空间。
如果这是真的,xpath查询将起作用。
这里的问题是,该查询是一个DOMNodeList。 var_dump seens不适用于此。
您可以使用以下内容:
1 2 3 4 5 6 | $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} "; } |
生成此输出(在输入xml中添加命名空间后):
1 | node: w:t,value: Testing |
您有一个无效的xpath查询需要修复,因为无效的xpath查询将始终导致错误。你无法使用它的结果来获取节点。
不幸的是,xpath查询无效,因为XML无效。所以你不能先使用xpath查询(或进一步测试/继续编写它)而不先修复XML。
根据您在问题中提供的XML,它显然缺少w-prefix的名称空间声明。
您需要将错误报告启用到最高级别(
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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 |
如图所示,XML存在许多问题,最终导致xpath查询无效,最终导致整个脚本停止。