首页 > 解决方案 > 在 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);
    }
}

标签: phpxml

解决方案


您可以使用 PHPDOMDocumentDOMXPath提取所需的信息。通过在 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

3v4l.org 上的演示


推荐阅读