关于xml:PHP xPath docx解析

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的名称空间声明。

您需要将错误报告启用到最高级别(E_ALL),在开发环境中显示错误,通常还要记录错误。然后,您可以按照错误日志:

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查询无效,最终导致整个脚本停止。