我必须使用PHP在XML标记上添加一个新子代。
我创建了一个小的PHP脚本来打开与该文件的文件夹的FTP连接,XML文件可以在其中进行编辑,并使用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>
我希望该代码在<FatturaElettronicaBody>
内附加两个标签。
我有该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>
答案 0 :(得分:1)
打开FTP连接不会使其他功能神奇地访问FTP服务器上的文件。他们仍然使用本地文件。您的fopen
对其余代码也不起作用。
SimpleXML函数确实支持URL包装器。如果您在PHP中启用了URL wrappers,则只需在simplexml_load_file
和asXML
调用中使用FTP URL。尽管FTP URL包装器需要设置context option overwrite
以允许覆盖现有文件。而且SimpleXML不允许使用上下文选项。因此,您必须先删除现有文件,然后再保存(unlink
调用)。
$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下载到内存中,在内存中进行编辑,然后再上传回去。
一些参考文献: