在FTP文件夹上编辑XML文件

时间:2019-04-16 14:11:18

标签: php xml ftp

我必须使用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>

1 个答案:

答案 0 :(得分:1)

打开FTP连接不会使其他功能神奇地访问FTP服务器上的文件。他们仍然使用本地文件。您的fopen对其余代码也不起作用。


SimpleXML函数确实支持URL包装器。如果您在PHP中启用了URL wrappers,则只需在simplexml_load_fileasXML调用中使用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下载到内存中,在内存中进行编辑,然后再上传回去。

一些参考文献: