无法获取HTML,因为它位于XML节点内



我正在做一个脚本,它获取一个xml文件并在其中显示一些文本

<documento fecha_actualizacion="20221027071750">
<metadatos>
[...]
</metadatos>
<analisis>
[...]
</analisis>
<texto>
<dl>
<dt>1. Poder adjudicador: </dt>
<dd>
[...]
</dd>
</dl>
</texto>
</documento>

我正在尝试将'texto'元素中的html作为字符串('<dl><dt>1. Poder ad[...]</dt></dd>[...]'(,但当得到它时,它显示为:

Array ( [0] => SimpleXMLElement Object ( [dl] => SimpleXMLElement Object ( [dt] => Array ( [0] => 1. Poder adjudicador: [1] => 2. Tip

按元素(dl、dt、dd等(排序。我已经尝试了所有可能的解决方案来查询"texto"元素(使用"//texto/text(("、innerhtml、node((、nodeValue((等(,但它总是给我相同的结果。

我怎么能得到像'<dl><dt>1. Poder ad[...]</dt></dd>[...]'这样的东西

谢谢!!

我尝试过选择器:

$texto = $xml->xpath('//texto/text()');
$texto = $xml->xpath('//texto/innerXml()');
$texto = $xml->xpath('//texto/node()');
$texto = $xml->xpath('//texto/nodevalue()');

您需要获取父节点(texto(,迭代并将每个子节点保存为XML:

$documento = new SimpleXMLElement(getXMLstring());
foreach ($documento->xpath('//texto') as $texto) {
$result = '';
foreach ($texto->children() as $content) {
$result .= $content->asXML(); 
}
var_dump($result);
}

输出:

string(59) "<dl>
<dt>1. Poder adjudicador: </dt>
<dd>
[...]
</dd>
</dl>"

SimpleXML是一种专注于元素节点的抽象。它有局限性。如果texto元素可以具有非元素子节点,则它们将不被包括在内。在这种情况下,您需要使用DOM。

$document = new DOMDocument();
$document->loadXML(getXMLString());
$xpath = new DOMXpath($document);
foreach ($xpath->evaluate('//texto') as $texto) {
$result = '';
foreach ($texto->childNodes as $content) {
$result .= $document->saveXML($content); 
}
var_dump($result);
}

此外,DOMXpath::evaluate()支持完整的Xpath 1.0,包括返回标量值的表达式。

最新更新