无法使用 XML 文件的 PHP 读取子节点
Posted
技术标签:
【中文标题】无法使用 XML 文件的 PHP 读取子节点【英文标题】:Cannot read the subnodes with PHP of an XML file 【发布时间】:2021-05-31 02:24:39 【问题描述】: 我正在使用 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 (Weitere Infos:) 元素,如何访问?
谢谢
【问题讨论】:
【参考方案1】: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
)
);
【讨论】:
以上是关于无法使用 XML 文件的 PHP 读取子节点的主要内容,如果未能解决你的问题,请参考以下文章