如何处理 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”
我想使用 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”