PHP xPath docx解析

PHP xPath docx解析,php,xml,xpath,ms-word,docx,Php,Xml,Xpath,Ms Word,Docx,我试图打开一个Word 2007文档(docx),我将其依次解压,但代码的xPath部分有问题。我想迭代每个元素并获取元素中的文本 在下面的当前示例中,我试图获取第一个元素的文本,以适应xPath系统 document.xml <w:document> <w:body> <w:p> <w:r> <w:t>Testing</w:t>

我试图打开一个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>

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

因此,我假设缺少名称空间只是因为示例XML。 原始文档将提供名称空间。 如果这是真的,xpath查询将工作。 这里的问题是,该查询是一个域节点列表。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添加名称空间后):


如果您设置了一个变量,然后检查下一行是否设置了=不必要。还考虑将代码从提取XML文件中分离出来,以进行XML解析。这不能都在一个地方。另外,你的问题对于更多在这里解压的用户来说更有意义。同样,在询问一般问题之前(比如一个故事的长描述,一个人做什么和不做什么等等,yadda yadda yadda),首先检查错误消息。提供具体信息,说明哪里出了问题。我给你一个答案来说明这一点,试着尝试一下。这可能会让事情变得更简单,因为它是专门针对Word的。如果您已经成功地启用了错误消息,您可能仍然有点困惑。请看一下这里的描述:因此我假设缺少名称空间只是因为示例xml。你说得对。谢谢,这正是我要找的@hr_117
$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";
}
   node: w:t,value: Testing