php - 无法使用 XML 文件的 PHP 读取子节点
问题描述
我正在使用 PHP 读取 XML 文件,如下所示:
$this->dom->loadHTML('<?xml encoding="UTF-8">' . $strbody );
$xp = new \DOMXPath($this->dom);
foreach( $xp->query('//div | //ul | //ol') as $node) {
array_push($nodes, $node);
}
// Further processing of the individual elements.
// "2 loop".
foreach( $nodes as $node)
{
echo "node: " . print_r($node, true) . PHP_EOL;
}
通过2 循环我想访问子揉捏。
从这个节点我可以输出属性:
foreach ( $node->attributes as $nodeValue )
{
echo "attributes: ".print_r($nodeValue, true).PHP_EOL;
}
或者我也可以打印出子节点:
foreach ( $node->childNodes as $nodeValue )
{
echo "childNodes: ".print_r($nodeValue, true).PHP_EOL;
}
但是我怎样才能访问子节点呢?
下面是 XML 文件的结构:
<startxml system="https://bspurl.de" sprache="DE">
<inhalt bez="body" sprache="DE">
<objekt type="xhtml">
</div class="text">
sadf gfew
</div>
<div class="h2">Überschrift</div>
<div class="text">
<span class="bold">Weitere Infos:</span>
</div>
</div class="text">
asf 43 rfedv34asd
</div>
</objekt>
</inhalt>
</startxml>
我需要访问span (< span class="bold">Weitere Infos:</span >) 元素,怎么做?
谢谢
解决方案
的第二个参数DOMXpath::evaluate()/query()
是 Xpath 表达式的上下文节点。因此,您可以寻址相对于当前节点的节点。
DOMNode::$textContent
返回节点的文本内容,包括其后代节点。
$xml = <<<'XML'
<?xml version="1.0" encoding="UTF-8"?>
<startxml system="https://bspurl.de" sprache="DE">
<inhalt bez="body" sprache="DE">
<objekt type="xhtml">
<div class="text">before</div>
<div class="h2">Überschrift</div>
<div class="text">
<span class="bold">Weitere Infos:</span>
</div>
<div class="text">after</div>
</objekt>
</inhalt>
</startxml>
XML;
$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMxpath($document);
foreach ($xpath->evaluate('//div') as $div) {
var_dump('DIV: ', $div->textContent);
foreach ($xpath->evaluate('.//span[@class="bold"]', $div) as $span) {
var_dump('SPAN:', $span->textContent);
}
}
DOMxpath::evaluate()
可以返回标量值。这允许在 Xpath 中转换值:
foreach ($xpath->evaluate('//objekt[@type="xhtml"]') as $objekt) {
var_dump(
$xpath->evaluate(
'string(.//div[@class="h2"]/following-sibling::*//span[@class="bold"])',
$objekt
)
);
}
推荐阅读
- visual-studio-code - VSCode 扩展测试:在测试中使用 `vscode.executeDefinitionProvider`
- powershell - PS 凭证重试
- javascript - next.config 中的配置图像域与动态域?
- mapbox - 如何在 Mapbox 瓦片请求中捕获无效或过期令牌的错误
- python - MacM1:无法使用 ImageDataGenerator。需要 Scipy,但已安装
- java - 在没有行/列顺序的情况下将二维 (2D) 数组作为一个整体进行排序
- sass - Parcel build 命令在尝试编译时抛出错误
- typescript - 打字稿项目参考构建+观看
- python - cx_freeze - ImportError:无法在 PATH 上找到 Qt5Core.dll
- mongodb - 如何在 mongodb 聚合中复制文档常量时间?