如何处理 PHP DOMXPath 中的多个子元素?

How to handle multiple sub-elements in PHP DOMXPath?

我想使用 PHP 将 HTML 文档导入 MySQL 数据库。

文档的结构如下所示:

<p class="word">
<span class="word-text">word1</span>
<span class="grammatical-type">noun</span>
</p>
...
<p class="word">
<span class="word-text">word128</span>
<span class="grammatical-type">adjective</span>
</p>

对于每个 word,我只有一个 word-text 和一个 grammatical-type.

我能够找到每个 word 节点,但对于它的每个子节点 word-text语法类型 我想执行 MySQL 查询 :

$dom = new DOMDocument();
            $dom->loadHTMLFile($location);
            $xpath = new DomXPath($dom);
            $res = $xpath->query("//p[@class='word']");
            foreach ($res as $textNode) {
                //do something here for each *word-text*->nodeValue
                //do something here for each *grammatical-type*->nodeValue
                }
            }

我尝试在 foreach 循环中传递 $textNode,这是一个 DOMNode,作为 $contextNode,如下所示:

$wordText = $xpath->query("span[@class='word-text']", $textNode);
$myWord = $wordText->nodeValue;

但是在 $wordText 中我只有一个 DOMNodeList 和一个 NULL nodeValue.

如何从word节点开始管理子节点?

谢谢

已解决。

你只需要,因为你知道 node 只包含一个元素,select 这个元素使用 item(0) :

$dom = new DOMDocument();
            $dom->loadHTMLFile($location);
            $xpath = new DomXPath($dom);
            $res = $xpath->query("//p[@class='word']");
            foreach ($res as $textNode) {
                $wordTextNode = $xpath->query("span[@class='word-text']", $textNode);
                $word = $wordTextNode->item(0)->nodeValue;

                //do same thing here for each *grammatical-type*
                }
            }

您可以在 $xpath->query 调用中提供不同的节点作为上下文:

<?php

$location = 'so-dom.html';
$dom = new DOMDocument();
            $dom->loadHTMLFile($location);
            $xpath = new DomXPath($dom);
            $res = $xpath->query("//p[@class='word']");
            foreach ($res as $textNode) {
                echo $xpath->query('./a/text()', $textNode)[0]->nodeValue;
                                                //^^^^^^^^^
                };

?>

医生在哪里

<head></head>
<body>
  <p class="word"><a>one</a></p>
  <p class="word"><a>two</a></p>
</body>

将打印“onetwo”