1

我正在尝试打开一个 Word 2007 文档 (docx),我连续解压缩它,但我遇到了代码的 xPath 部分的问题。我想迭代每个元素并获取元素中的文本。

在下面的当前示例中,我试图让第一个元素的文本适应 xPath 系统。

文档.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);
4

2 回答 2

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
于 2013-05-03T17:51:12.587 回答
0

您有一个无效的 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 查询无效并最终导致整个脚本停止。

于 2013-05-03T17:05:18.953 回答