是否可以只运行一个查询来替换多个查询?
//host_info[hostname="localhost" and vulnerability_id="remote_execution"][1]
//host_info[hostname="localhost" and vulnerability_id="remote_execution"][1]/@exclude
//host_info[hostname="localhost" and vulnerability_id="remote_execution"][1]/../problem[1]
//host_info[hostname="localhost" and vulnerability_id="remote_execution"][1]/../reference[1]
//host_info[hostname="localhost" and vulnerability_id="remote_execution"][1]/../impact[1]
//host_info[hostname="localhost" and vulnerability_id="remote_execution"][1]/../background[1]
//host_info[hostname="localhost" and vulnerability_id="remote_execution"][1]/../resolution[1]由于某些原因,这在PHP的xpath()函数中不起作用。
//host_info[hostname="localhost" and vulnerability_id="remote_execution"]/(*, ../background, ../impact, ../problem)我觉得这里一定有更好的方法。请注意,有可能有多个<host_info>节点,这就是我将主机名和vulnerability_id作为目标的原因。但是父<background>节点中只有一个<resolution>节点,即<vulnerability_id>节点。
<report>
<vulnerability>
<host_info>
<hostname></hostname>
<vulnerability_id></vulnerability_id>
</host_info>
<host_info>
<hostname></hostname>
<vulnerability_id></vulnerability_id>
</host_info>
<background></background>
<resolution></resolution>
</vulnerability>
<vulnerability>
<host_info></host_info>
<host_info></host_info>
<host_info></host_info>
<host_info></host_info>
<background></background>
<resolution></resolution>
</vulnerability>
</report>发布于 2019-10-14 16:38:23
节点列表只有一个维度,因此将多个项的详细信息序列化为单个列表并不真正有用。
通常,您需要使用一个Xpath表达式来标识列表节点,然后使用DOM方法和相关表达式来获取与这些节点相关的数据:
$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMxpath($document);
foreach ($xpath->evaluate('//host_info[hostname="localhost" and vulnerability_id="remote_execution"]') as $hostInfo) {
var_dump(
[
$hostInfo->getAttribute('exclude'),
$xpath->evaluate('string(parent::*/background)', $hostInfo),
$xpath->evaluate('string(parent::*/resolution)', $hostInfo)
]
);
}对于单个项,可以将所有细节节点提取到单个结果列表中。然而,这样的表达式会很快变得复杂,然后您必须添加识别不同细节节点的逻辑。
$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMxpath($document);
$expression = <<<'XPATH'
//host_info[hostname="localhost" and vulnerability_id="remote_execution"][1]/@exclude|
(//host_info[hostname="localhost" and vulnerability_id="remote_execution"][1]/parent::*/background)[1]|
(//host_info[hostname="localhost" and vulnerability_id="remote_execution"][1]/parent::*/resolution)[1]
XPATH;
foreach ($xpath->evaluate($expression) as $detail) {
var_dump(
$detail->localName, $detail->textContent
);
} https://stackoverflow.com/questions/58380236
复制相似问题