我必须使用PHP在XML标记上添加一个新的子项。
我创建了一个小PHP脚本,用于打开到要编辑的XML文件所在文件夹的FTP连接,并使用SimpleXML编辑和向该文件添加新的子文件。
<html lang="it">
<head>
<title>Modifica Fattura</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
</head>
<body style="text-align: center;">
<h2 class="text-center">Modifica</h2>
<form style="display: inline-block;" method="post">
<input type="text" name="nome_file" placeholder="Inserisci il nome del file">
<br>
<select name="banca">
<option value="000000936">INT</option>
<option value="000092413">BIO</option>
</select>
<br>
<input type="submit" name="invia" value="Modifica XML">
</form>
<?php
$ftp_server = "xxx.xxx.xxx.xxx";
$ftp_username = "xxxxxxx";
$ftp_password = "xxxxxxx";
$conn_ftp = ftp_connect($ftp_server) or die ("Non posso connettermi al server FTP");
$login_ftp = ftp_login($conn_ftp,$ftp_username,$ftp_password);
if ($login_ftp){
if (isset($_POST['nome_file'])) {
$nome_file = $_POST['nome_file'];
$fp = fopen($nome_file,'w');
$banca = $_POST ['banca'];
$xml = simplexml_load_file($nome_file);
if ($xml){
$fatt_primo = $xml->FatturaElettronicaBody;
$pagamento = $fatt_primo->addChild('DatiPagamento');
$dettaglio_pagamento = $pagamento->addChild('DettaglioPagamento');
$dettaglio_pagamento->addChild('IBAN', $banca);
$xml->asXML($nome_file);
}
fclose($fp);
}
}
?>
</body>
</html>
我希望代码在
我有那个XML:
<?xml version="1.0" encoding="UTF-8"?>
<p:FatturaElettronica xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2" versione="FPR12" xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2 http://www.fatturapa.gov.it/export/fatturazione/sdi/fatturapa/v1.2/Schema_del_file_xml_FatturaPA_versione_1.2.xsd">
<FatturaElettronicaHeader>
<DatiTrasmissione>
<IdTrasmittente>
<IdPaese>IT</IdPaese>
<IdCodice>1122</IdCodice>
</IdTrasmittente>
<ProgressivoInvio>2</ProgressivoInvio>
<FormatoTrasmissione>FPR12</FormatoTrasmissione>
<CodiceDestinatario>SSDPV</CodiceDestinatario>
<ContattiTrasmittente>
<Telefono>1223111</Telefono>
<Email>email@email.it</Email>
</ContattiTrasmittente>
</DatiTrasmissione>
<CedentePrestatore>
<DatiAnagrafici>
<IdFiscaleIVA>
<IdPaese>IT</IdPaese>
<IdCodice>88855443</IdCodice>
</IdFiscaleIVA>
<Anagrafica>
<Denominazione>REREWRWE</Denominazione>
</Anagrafica>
<RegimeFiscale>RF17</RegimeFiscale>
</DatiAnagrafici>
<Sede>
<Indirizzo>VIA PIPPO</Indirizzo>
<CAP>06000</CAP>
<Comune>ROMA</Comune>
<Provincia>RM</Provincia>
<Nazione>IT</Nazione>
</Sede>
<Contatti>
<Telefono>12321321</Telefono>
<Email>EMAIL@EMAIL.IT</Email>
</Contatti>
<RiferimentoAmministrazione>7</RiferimentoAmministrazione>
</CedentePrestatore>
<CessionarioCommittente>
<DatiAnagrafici>
<IdFiscaleIVA>
<IdPaese>IT</IdPaese>
<IdCodice>00123321321</IdCodice>
</IdFiscaleIVA>
<CodiceFiscale>00123321321</CodiceFiscale>
<Anagrafica>
<Denominazione>FRITTTROP</Denominazione>
</Anagrafica>
</DatiAnagrafici>
<Sede>
<Indirizzo>VIA ELSI</Indirizzo>
<CAP>00100</CAP>
<Comune>ROMA</Comune>
<Provincia>RM</Provincia>
<Nazione>IT</Nazione>
</Sede>
</CessionarioCommittente>
</FatturaElettronicaHeader>
<FatturaElettronicaBody>
<DatiGenerali>
<DatiGeneraliDocumento>
<TipoDocumento>TD01</TipoDocumento>
<Divisa>EUR</Divisa>
<Data>2019-04-08</Data>
<Numero>12</Numero>
<ImportoTotaleDocumento>384.30</ImportoTotaleDocumento>
<Causale>Fattura</Causale>
</DatiGeneraliDocumento>
</DatiGenerali>
<DatiBeniServizi>
<DettaglioLinee>
<NumeroLinea>1</NumeroLinea>
<Descrizione>TEST</Descrizione>
<PrezzoUnitario>250.00</PrezzoUnitario>
<PrezzoTotale>250.00</PrezzoTotale>
<AliquotaIVA>22.00</AliquotaIVA>
</DettaglioLinee>
<DatiRiepilogo>
<AliquotaIVA>22.00</AliquotaIVA>
<ImponibileImporto>315.00</ImponibileImporto>
<Imposta>69.30</Imposta>
<EsigibilitaIVA>I</EsigibilitaIVA>
</DatiRiepilogo>
</DatiBeniServizi>
</FatturaElettronicaBody>
</p:FatturaElettronica>
我想在另外两个标签中添加如下内容:
<FatturaElettronicaBody>
<DatiPagamento>
<DettaglioPagamento>
<IBAN>12312312</IBAN>
</DettaglioPagamento>
</DatiPagamento>
</FatturaElettronicaBody>
打开FTP连接不会使其他功能神奇地访问FTP服务器上的文件。他们仍然使用本地文件。您的fopen
也不会对代码的其余部分产生任何影响。
SimpleXML函数确实支持URL包装器。如果在PHP中启用了URL包装器,则只需在simplexml\u load\u文件
和asXML
调用中使用FTP URL即可。尽管FTP URL包装器需要设置上下文选项覆盖
,以允许覆盖现有文件。SimpleXML不允许上下文选项。因此,您必须在保存之前删除现有文件(调用取消链接)。
$ftp_server = "ftp.example.com";
$ftp_username = "username";
$ftp_password = "password";
if (isset($_POST['nome_file'])) {
$nome_file = $_POST['nome_file'];
$url = "ftp://$ftp_username:$ftp_password@$ftp_server/$nome_file";
$banca = $_POST ['banca'];
$xml = simplexml_load_file($url);
if ($xml){
$fatt_primo = $xml->FatturaElettronicaBody;
$pagamento = $fatt_primo->addChild('DatiPagamento');
$dettaglio_pagamento = $pagamento->addChild('DettaglioPagamento');
$dettaglio_pagamento->addChild('IBAN', $banca);
unlink($url);
$xml->asXML($url);
}
}
这很容易,但效率很低。它涉及到FTP的三个连接(用于读取、删除和写入)。
还请注意,如果您的凭证包含一些特殊符号,则需要对其进行URL编码。
要获得更高效的解决方案,请将XML下载到内存中,在内存中编辑它并将其上载回。
这方面的一些参考资料: