You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP读取嵌套XML类别子节点数据问题求助

解决PHP读取FatturaPA XML子节点的问题

问题分析

你遇到的核心问题是XML存在命名空间(根节点的p:前缀),且未遵循XML层级结构访问节点,导致无法读取IdTrasmittente之外的其他子节点数据。

解决方案

1. 处理命名空间

XML根节点使用p前缀的命名空间,对应的URI为:http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2,必须先指定该命名空间才能正确访问节点。

2. 完整示例代码

以下代码展示如何读取XML中所有关键子节点的值:

// 加载XML文件
$xml = simplexml_load_file('example.xml');

// 注册命名空间(也可通过children方法直接指定)
$xml->registerXPathNamespace('p', 'http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2');

// 访问FatturaElettronicaHeader节点
$header = $xml->children('p', true)->FatturaElettronicaHeader;

// --- 读取DatiTrasmissione及IdTrasmittente ---
$datiTrasmissione = $header->DatiTrasmissione;
$idTrasmittente = $datiTrasmissione->IdTrasmittente;
$idPaese = (string)$idTrasmittente->IdPaese;
$idCodice = (string)$idTrasmittente->IdCodice;
echo "IdTrasmittente: {$idPaese} - {$idCodice}\n\n";

// --- 读取CedentePrestatore信息 ---
$cedente = $header->CedentePrestatore;
$cedenteAnagrafici = $cedente->DatiAnagrafici;
$cedenteIdFiscale = $cedenteAnagrafici->IdFiscaleIVA;
$cedenteDenominazione = (string)$cedenteAnagrafici->Anagrafica->Denominazione;
$cedenteRegime = (string)$cedenteAnagrafici->RegimeFiscale;
$cedenteSede = $cedente->Sede;

echo "Cedente Prestatore:\n";
echo "  Ragione Sociale: {$cedenteDenominazione}\n";
echo "  Partita IVA: {$cedenteIdFiscale->IdPaese} - {$cedenteIdFiscale->IdCodice}\n";
echo "  Regime Fiscale: {$cedenteRegime}\n";
echo "  Sede: {$cedenteSede->Indirizzo}, {$cedenteSede->CAP} {$cedenteSede->Comune} ({$cedenteSede->Provincia})\n\n";

// --- 读取CessionarioCommittente信息 ---
$cessionario = $header->CessionarioCommittente;
$cessionarioAnagrafici = $cessionario->DatiAnagrafici;
$cessionarioDenominazione = (string)$cessionarioAnagrafici->Anagrafica->Denominazione;
$cessionarioCodFiscale = (string)$cessionarioAnagrafici->CodiceFiscale;

echo "Cessionario Committente:\n";
echo "  Ragione Sociale: {$cessionarioDenominazione}\n";
echo "  Codice Fiscale: {$cessionarioCodFiscale}\n\n";

// --- 读取FatturaElettronicaBody内容 ---
$body = $xml->children('p', true)->FatturaElettronicaBody;

// 读取DatiGeneraliDocumento
$datiDoc = $body->DatiGenerali->DatiGeneraliDocumento;
echo "Dati Documento:\n";
echo "  Tipo: {$datiDoc->TipoDocumento}\n";
echo "  Numero: {$datiDoc->Numero}\n";
echo "  Data: {$datiDoc->Data}\n";
echo "  Divisa: {$datiDoc->Divisa}\n";
// 处理多个Causale节点
echo "  Causale: ";
$causali = [];
foreach ($datiDoc->Causale as $causale) {
    $causali[] = (string)$causale;
}
echo implode(' ', $causali) . "\n\n";

// 读取DettaglioLinee(多行商品/服务)
echo "Dettagli Linee:\n";
foreach ($body->DatiBeniServizi->DettaglioLinee as $linea) {
    echo "Linea {$linea->NumeroLinea}:\n";
    echo "  Descrizione: {$linea->Descrizione}\n";
    echo "  Quantità: {$linea->Quantita} - Prezzo Unitario: {$linea->PrezzoUnitario}€\n";
    echo "  Totale Linea: {$linea->PrezzoTotale}€ - Aliquota IVA: {$linea->AliquotaIVA}%\n";
}

// 读取DatiPagamento
$datiPagamento = $body->DatiPagamento;
echo "\nDati Pagamento:\n";
echo "  Condizioni: {$datiPagamento->CondizioniPagamento}\n";
echo "  Modalità: {$datiPagamento->DettaglioPagamento->ModalitaPagamento}\n";
echo "  Scadenza: {$datiPagamento->DettaglioPagamento->DataScadenzaPagamento}\n";
echo "  Importo Totale: {$datiPagamento->DettaglioPagamento->ImportoPagamento}€\n";

关键注意事项

  • 命名空间处理:必须通过registerXPathNamespace或children('p', true)指定命名空间,否则无法识别带p:前缀的根节点。
  • 层级访问:严格按照XML嵌套结构访问节点(如FatturaElettronicaHeader -> CedentePrestatore -> DatiAnagrafici)。
  • 类型转换:读取节点值时用(string)强制转换为字符串,避免返回SimpleXMLElement对象。
  • 重复节点遍历:对于多个同名节点(如Causale、DettaglioLinee),使用foreach循环读取所有内容。

内容的提问来源于stack exchange,提问作者Marco Messere

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 20:25:11