首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP xPath文档解析

PHP xPath文档解析
EN

Stack Overflow用户
提问于 2013-05-04 00:49:06
回答 2查看 2K关注 0票数 1

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

在下面的当前示例中,我正在尝试获取第一个元素的文本,以适应xPath系统。

document.xml

代码语言:javascript
复制
<w:document>
    <w:body>
        <w:p>
            <w:r>
                <w:t>Testing</w:t>
            </w:r>
        </w:p>
    </w:body>
</w:document>

PHP

代码语言:javascript
复制
$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);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-04 01:51:13

因此,我假设缺少名称空间仅仅是因为缩短了示例xml。原始文档将提供名称空间。如果这是真的,那么xpath查询将会工作。这里的问题是,该查询是一个DOMNodeList。var_dump似乎不会为此而工作。您可以使用类似以下内容:

代码语言:javascript
复制
$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之后):

代码语言:javascript
复制
   node: w:t,value: Testing
票数 2
EN

Stack Overflow用户

发布于 2013-05-04 01:05:19

您得到了一个无效的xpath查询,该查询需要修复,因为无效的xpath查询总是会导致错误。您不能使用它的结果来从中提取节点。

遗憾的是,xpath查询无效,因为XML无效。因此,如果不先修复XML,就不能使用xpath查询(或进一步测试它/继续编写它)。

在您的问题中提供的XML中,显然缺少w前缀的名称空间声明。

您需要启用对最高级别(E_ALL)的错误报告、开发环境中的错误显示以及一般情况下的错误日志记录。然后,您可以查看错误日志:

代码语言:javascript
复制
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查询无效,并最终导致整个脚本停止。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16363947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档