我正在尝试打开Word 2007文档(docx),我先后解压缩它,但我遇到了代码的xPath部分的问题。我想迭代每个元素并获取元素中的文本。
在下面的当前示例中,我试图获取第一个元素的文本以适应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);
所以我假设缺少名称空间只是因为缩短了示例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
您有一个无效的xpath查询,需要修复,因为无效的xpath查询总是会导致错误。您不能使用它的结果来从中获取节点。
不幸的是,xpath查询无效,因为XML无效。因此,如果不先修复XML,就不能使用xpath查询(或进一步测试它/继续编写它)。
从您在问题中提供的XML中,它显然缺少w前缀的名称空间声明。
您需要启用向最高级别(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
如上面所示,XML存在许多问题,这些问题最终会导致xpath查询无效,并最终导致整个脚本停止运行。