2016-04-01 6 views
0

Ich habe eine XML-Datei mit einem Tag, das eine Base64-Zeichenfolge, wie diese enthält:Probleme Kopieren Base64-String aus XML-Datei in einer Textdatei

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Header/> 
    <SOAP-ENV:Body> 
     <PercezioniEStorni> 
      <MsgPercezioniStorni> 
       <ApplicazioneChiamante>PEI</ApplicazioneChiamante> 
       <DataElaborazione>31/03/2016</DataElaborazione> 
       <CodiceSede>3700203</CodiceSede> 
       <Esercizio>2015</Esercizio> 
       <Trimestre>4</Trimestre> 
       <PeriodoDal>01/10/2015</PeriodoDal> 
       <PeriodoAl>31/12/2015</PeriodoAl> 
       <DataValidazione>31/03/2016</DataValidazione>    
       <UtenteValidatore>giuseppe</UtenteValidatore> 
       <CodFiscFirmatario>VGRGPP79E08E919T</CodFiscFirmatario> 
       <PercezioniEStorniTypeZip>   
        <!-- Base64 example String --> 
        VUVzREJCUUFDQUFJQUNOcWYwZ0FBQUFBQUFBQUFBQUFBQUFaQUFBQWNtVm5hWE4wY204dE1Ua3lMVEl3TVRZeE1TMHhMbmh0Yk96ZGE1UGt4blh1KzYrUzRUZDh4 V0YzOWQzQm80aFZCVlFqdTNBWkpnRHlWTDFqeUF5WkVUS3BFR2w3Ny9QcFQ2Sm1lTEZrdTFkM3I4UWdoWC9FRG0xcWhxWmt6eTlYTCtTVEsvUExuMzc4OWkvZi9mQWYvMX rOEIvZi9mbkh2M3puL3MrLy9mbUhuLzc1NHkvL1AvLzByei8vL0pkLy91S0xuLzc0cjkvOTI3Yy92WXUvTy8zV3V4Ly8rcWN2cHIvNDRydVAvM05mL05QSC84bi84OU8vL1BvLzlaLy8rWi92L3ZQcS9= 
       </PercezioniEStorniTypeZip> 
      </MsgPercezioniStorni> 
     </PercezioniEStorni> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Der Base64-String eine Zip-Datei kodieren (ist nur ein Beispiel, enthält nicht wirklich eine Zip-Datei, die echte Zeichenfolge ist zu lang). Ich habe diese xml erstellt durch JAXB-Klassen auf diese Weise erzeugt:

FileInputStream zipFis = new FileInputStream(fileZip); 
    buffer = new byte[(new Long(fileZip.length())).intValue()]; 
    zipFis.read(buffer); 
    zipFis.close(); 
    String encoded = Base64.encode(buffer); 

    PercezioniEStorni percezioniStorni = new PercezioniEStorni(); 
    /** ...set other properties... **/ 
    MsgPercezioniStorni msgPercezioniStorni = new MsgPercezioniStorni(); 
    /** ...set other properties... **/ 
    msgPercezioniStorni.setPercezioniEStorniTypeZip(encoded.getBytes()); 
    percezioniStorni.setMsgPercezioniStorni(msgPercezioniStorni); 

    JAXBContext jaxbContext = JAXBContext.newInstance(PercezioniEStorni.class,percezioniStorni); 
    Marshaller marshaller = jaxbContext.createMarshaller(); 
    Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); 
    marshaller.marshal(element, document); 
    MessageFactory mf = MessageFactory.newInstance(); 
    SOAPMessage message = mf.createMessage(); 
    message.getSOAPBody().addDocument(document); 

    File fileXml = new File(xmlPath); 
    file.createNewFile(); 
    FileOutputStream fileOutput = new FileOutputStream(fileXml); 
    message.writeTo(fileOutput); 
    fileOutput.close(); 

Und dann umgekehrt ich den Prozess:

File file = new File(xmlPath); 
    FileInputStream fis = new FileInputStream(file); 
    BufferedReader br = new BufferedReader(new InputStreamReader(fis,"UTF-8")); 
    String xml = ""; 
    while(br.ready()){ 
     xml += br.readLine(); 
    } 
    br.close(); 

    MessageFactory mf = MessageFactory.newInstance(); 
    SOAPMessage message = mf.createMessage(); 
    SOAPPart soapPart = message.getSOAPPart(); 

    InputSource is = new InputSource(); 
    is.setByteStream(new ByteArrayInputStream(xml.getBytes("UTF-8"))); 

    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
    dbFactory.setNamespaceAware(true); 
    DocumentBuilder builder = dbFactory.newDocumentBuilder(); 
    Document document = builder.parse(is); 
    DOMSource domSource = new DOMSource(document); 

    soapPart.setContent(domSource); 
    message.saveChanges(); 
    PercezioniEStorni perc = SOAPUtil.unmarshal(PercezioniEStorni.class,message); 
    byte[] decoded = Base64.decode(new String(perc.getMsgPercezioniStorni().getPercezioniEStorniTypeZip())); 
    File zipFile = new File(zipPath); 
    zipFile.createNewFile(); 
    FileOutputStream out = new FileOutputStream(zipFile); 
    out.write(decoded); 
    out.close(); 

Alles funktioniert gut. Das Archiv ist erfolgreich dekodiert und ich kann es entpacken.

Später habe ich die Base64-Zeichenfolge manuell aus der XML-Datei in eine andere Textdatei kopiert. Ich lese diese Datei von Java auf diese Weise:

File txtFile = new File(textFilePath); 
    FileInputStream fis = new FileInputStream(txtFile); 
    Reader r = new InputStreamReader(fis,"UTF-8"); 
    StringBuilder sb = new StringBuilder(); 
    int buffer = 0; 
    while ((buffer= r.read())!=-1) { 
     sb.append((char)buffer); 
    } 
    fis.close(); 
    File zipFile = new File(zipPath); 
    zipFile.createNewFile(); 
    FileOutputStream out = new FileOutputStream(zipFile); 
    Base64.decode(sb.toString(),out); 
    out.close(); 

dieses Mal das Zip-Archiv beschädigt ist. Auch die Größe ist anders. Warum? Gibt es eine Möglichkeit, dieselbe Base64-Zeichenfolge aus einer anderen Datei zu lesen?

+0

Versuchen Sie, die Zeilenenden des Basis-64-codierten Blocks beizubehalten, anstatt sie zu entfernen (mithilfe von readLine). – Berger

+0

"Die Base64-Zeichenfolge codieren eine Zip-Datei" Sie haben eine Textcodierung (XML) einer Textcodierung (Base64) von Daten? Das klingt nach einer schlechten Idee. – Raedwald

+0

@Raedwald Ich versuche es besser zu erklären, die Zeichenfolge im Tag "" ist die Base64-Codierung der Zip-Datei. –

Antwort

1

Es sei denn, ich habe etwas übersehen: Sie werden einige Daten manuell codiert, aus einer ZIP-Datei lesen:

String encoded = Base64.encode(buffer); 

Dann setzen Sie eine Eigenschaft, die ein Byte-Array in Base64 speichern definiert ist, etwas zu zerbrechen das zu vermeiden, XML-Regeln:

msgPercezioniStorni.setPercezioniEStorniTypeZip(encoded.getBytes()); 

Nun ist der Bytes des codierten String encoded wieder verschlüsseln.

Kein Wunder, dass die Zeichen aus dem XML durch einen einzigen Dekodierschritt nicht zu einem gültigen Zip gemacht werden können. (Versuchen Sie zwei.)

Viel besser: Lassen Sie den ersten Kodierungsschritt fallen.

+0

Sie haben Recht! In der Schemadatei ist der Typ dieses Elements "type =" xsd: base64Binary "", was bedeutet, dass die Zeichenkette doppelt codiert ist, eine von mir manuell und eine nach Setter der Stub-Klasse. Danke –