php - 在 XML 中查找节点并获取父注释
问题描述
我有一个来自这样一个变量的 XML,其中“FatturaElettronicaBody”可以出现超过 1 次:
$variable = '<Root>
<FatturaElettronicaBody>
<DatiGenerali>
<DatiGeneraliDocumento>
<TipoDocumento>TD01</TipoDocumento>
<Divisa>EUR</Divisa>
<Data>2018-12-31</Data>
<Numero>2140/18</Numero>
<ImportoTotaleDocumento>1843.71</ImportoTotaleDocumento>
<Causale>FATTURA DIFFERITA VENDITA</Causale>
</DatiGeneraliDocumento>
<Attachment>
<Filename>Test-1.pdf</Filename>
<Base64File>nfsofsedfmskd=.......</Base64File>
</Attachment>
<Attachment>
<Filename>Test-2.pdf</Filename>
<Base64File>nfsogfdgdfgdfsffsdgsmskd=.......</Base64File>
</Attachment>
...
</DatiGenerali>
</FatturaElettronicaBody>
<FatturaElettronicaBody>
<DatiGenerali>
<DatiGeneraliDocumento>
<TipoDocumento>TD01</TipoDocumento>
<Divisa>EUR</Divisa>
<Data>2018-10-29</Data>
<Numero>2094/18</Numero>
<ImportoTotaleDocumento>500.43</ImportoTotaleDocumento>
<Causale>FATTURA VENDITA</Causale>
</DatiGeneraliDocumento>
<Attachment>
<Filename>Test-N.pdf</Filename>
<Base64File>nfsogdhswvervsv.......</Base64File>
</Attachment>
</DatiGenerali>
</FatturaElettronicaBody>
...
</Root>
';
我的目标是在 XML 中搜索节点“Numero”并获取父节点“DatiGeneraliDocumento”以显示有关找到的项目的信息。
例如,我需要找到 Numero = "2094/18" 并在其 "DatiGeneraliDocumento" 节点内打印所有信息。在本例中:
TipoDocumento = TD01
Divisa = EUR
Data = 2018-10-29
ImportoTotaleDocumento = 500.43
Causale = FATTURA VENDITA
PHP中是否有一个函数可以在不循环我所有的$变量的情况下做到这一点?
更新:我已经修改了我的第一个请求以获取“附件”节点:
例如,我需要找到 Numero =“2094/18”并在其“DatiGeneraliDocumento”节点和所有“附件”中打印所有信息。在本例中:
TipoDocumento = TD01
Divisa = EUR
Data = 2018-10-29
ImportoTotaleDocumento = 500.43
Causale = FATTURA VENDITA
Filename = Test-1.pdf
Base64File = nfsofsedfmskd=
Filename = Test-2.pdf
Base64File = nfsogfdgdfgdfsffsdgsmskd=
我已经尝试过运气:
$numeroFattura = "2094/18";
foreach ($xml->xpath('//DatiGenerali[Numero = "' . $numeroFattura . '"]') as $x) {
foreach($x as $v) {
echo $v->getName() .'='. $v ."<br>\n";
}
}
// GET ATTACHMENT <---this doesn't work
foreach ($xml->xpath('//FatturaElettronicaBody[Numero = "' . $numeroFattura . '"]') as $x) {
foreach ($x->xpath('//Allegati') as $allegato) {
var_dump($allegato);
}
}
解决方案
您可以使用 PHPDOMDocument
并DOMXPath
提取所需的信息。通过在 XPath 查询中指定节点值Numero
,我们只获得您感兴趣的节点:
$doc = new DOMDocument();
$doc->loadXML($variable);
$xpath = new DOMXPath($doc);
$nodes = $xpath->query("//DatiGeneraliDocumento[Numero='2094/18']");
foreach ($nodes as $nodelist) {
foreach ($nodelist->childNodes as $node) {
if ($node->nodeType === XML_ELEMENT_NODE) echo $node->nodeName . " = " . $node->nodeValue . "\n";
}
}
输出:
TipoDocumento = TD01
Divisa = EUR
Data = 2018-10-29
Numero = 2094/18
ImportoTotaleDocumento = 500.43
Causale = FATTURA VENDITA
推荐阅读
- ruby-on-rails - 在 Rails 中,# frozen_string_literal: true 指令与 StripParams 冲突
- vba - 将新电子邮件导出到文件
- angular - pdf.save 不是 Angular 6 中使用的 jspdf 中的函数错误
- sql-server - 存储过程错误:消息 512,级别 16,状态 1,过程 sp_ActFTC,第 64 行子查询返回超过 1 个值
- java - 活动类中的getArguments()?
- ubuntu - 无法在 ubuntu 14.04 LTS 上升级乘客
- wcf - WCF -“未能查找通道以接收传入消息。找不到端点或 SOAP 操作。” 但仅来自一位客户
- angular - TypeError:未定义不是对象(评估“parentOutlet.peekState”)
- java - 运行 javafx 应用程序时在后台播放 mp3 文件
- spring-amqp - Spring AMQP 有没有办法设置所有虚拟机的最大消费者数量?