XML tidak sepenuhnya dimasukkan ke dalam file setelah penyusunan

Saya mencoba menyusun objek dan mengganti beberapa karakter yang tidak valid setelah itu. Dalam proses ini, xml yang telah selesai tidak dihasilkan. Saya hanya dapat melihat 1024 karakter di semua file yang dihasilkan.

package com.test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.StringReader;
import java.util.Scanner;
import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.stream.StreamResult;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import org.apache.log4j.Logger;
import org.xml.sax.SAXException;
import com.sun.xml.bind.marshaller.NamespacePrefixMapper;

public class MessageParserComponent {
    private static final Logger LOGGER = Logger.getLogger(MessageParserComponent.class);

           public File marshalIXml(final Object obj, final String xsdSchema,
        final String xmlFileName, final JAXBContext ctx) {
        File xml = new File(xmlFileName);

        try {
            xml.createNewFile();
            Marshaller marshaller = null;
            marshaller = ctx.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
                Boolean.TRUE);
            marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION,
                "http://www.db.com/tf " + xsdSchema);
            marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper",
                new NamespacePrefixMapper() {
                    @Override
                    public String getPreferredPrefix(String arg0, String arg1,
                        boolean arg2) {
                        return "tf";
                    }
                });

            marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION,
                "http://www.db.com/tf " + xsdSchema);
            marshaller.setSchema(getSchema(xsdSchema));
            marshaller.marshal(obj, new StreamResult(xml));
            xml = replaceInvalidChar('\u0007', '\n', xml);
            xml = replaceInvalidString("ns2", "xsi", xml);
        } catch (IOException e) {
            LOGGER.error(e);
        } catch (JAXBException e) {
            LOGGER.error(e);
        } catch (SAXException e) {
            LOGGER.error(e);
        }
        return xml;
    }

  private Schema getSchema(String xsdSchema) throws SAXException {
        SchemaFactory fact = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = fact.newSchema(this.getClass().getClassLoader()
                                           .getResource(xsdSchema));
        return schema;
    }

   private static File replaceInvalidString(String Target, String Dest,
        File Source) throws IOException {
        String xml_string;
        xml_string = new Scanner(Source).useDelimiter("\\Z").next();
        xml_string = xml_string.replace(Target, Dest);
        FileOutputStream fi = new FileOutputStream(Source);
        fi.write(xml_string.getBytes());
        return Source;
    }

    public static File replaceInvalidChar(char Target, char Dest, File Source)
        throws IOException {
        String xml_string;
        xml_string = new Scanner(Source).useDelimiter("\\Z").next();
        xml_string = xml_string.replace(Target, Dest);
        FileOutputStream fi = new FileOutputStream(Source);
        fi.write(xml_string.getBytes());
        return Source;
    }
}

Apakah ada batasan untuk penggantian string?
Apakah saya membuat file dengan cara yang salah?

Catatan:

Saya menyimpan file di folder log UNIX
Saya memiliki Java 6, JAXB 2.2

Bantuan apa pun sangat dihargai.


person Pavan Sky    schedule 23.10.2013    source sumber
comment
Mungkin new Scanner(Source).useDelimiter(\\Z).next() hanya mengembalikan 1024 byte data. Lakukan marshal ke ByteArrayInputStream, lalu buat String darinya dan panggil metode replace() untuk melakukan penggantian. Kemudian simpan String ke dalam file Anda.   -  person Stanislav Mamontov    schedule 23.10.2013
comment
Terima kasih @Stanislav Mamontov, Tapi saya merasa ini memindai file input dan menyalin ke dalam string. Apa pun yang terjadi, saya akan memeriksanya dan menghubungi Anda kembali.   -  person Pavan Sky    schedule 23.10.2013
comment
Melihat masalah serupa di blog lain, mengatakan bahwa Karena satu kali membaca dengan “/z” sebagai pembatas harus membaca semuanya sampai “akhir masukan”, tergoda untuk hanya melakukan satu kali membaca dan berhenti di situ, seperti contoh yang tercantum di atas segalanya lakukan. Dalam kebanyakan kasus, tidak apa-apa, tapi saya telah menemukan setidaknya satu situasi di mana membaca ke "akhir input" tidak membaca seluruh input – ketika inputnya adalah SequenceInputStream, masing-masing konstituen InputStreams tampaknya memberikan "akhir" yang terpisah. masukan” itu sendiri.   -  person Pavan Sky    schedule 23.10.2013


Jawaban (3)


Periksa saja apakah Anda memberi anotasi pada objek Anda dengan anotasi jaxb dengan benar. Dan mengapa Anda menyetel properti Marshaller? apakah Anda ingin menggunakan skema eksternal untuk menyusun objek Anda? alih-alih mengapa Anda tidak membiarkan jaxb mengurus semua hal itu (jika objek Anda tersedia di ruang kerja yang sama).

Contoh program ini mungkin berguna bagi Anda. http://www.mkyong.com/java/jaxb-hello-world-example/

dan periksa ini juga..

JAXB Marshaller : Output StringWriter memiliki nilai tag terpotong nilai tag terpotong

person Bhanu Prasad Vellanki    schedule 23.10.2013
comment
Kita memerlukan awalan khusus untuk setiap elemen yang diharapkan oleh antarmuka lain, yang dibuat untuk menyetel properti marshaller. Sekarang masuk ke masalah kami, ini bukan karena marshaller, seperti yang dikatakan @Stanislav Mamontov, di lingkungan yang berbeda pemindai akan berperilaku berbeda, menyebabkan xml yang dihasilkan sepenuhnya terpotong menjadi 1024 karakter. - person Pavan Sky; 23.10.2013

Saat Anda membuka FileOutputStream Anda bertanggung jawab untuk menutupnya. Anda harus mengubah kode Anda untuk memasukkan panggilan close().

    FileOutputStream fi = new FileOutputStream(Source);
    fi.write(xml_string.getBytes());
    fi.close();
person bdoughan    schedule 23.10.2013
comment
Terima kasih atas pengingat postingannya, saya mendapatkannya lebih awal dan telah menutup streaming. - person Pavan Sky; 23.10.2013
comment
@PavanSky - Seharusnya begitu. - person bdoughan; 24.10.2013

Masalahnya ada pada pemindai, yang mencoba menemukan EOF dan tidak mengumpulkan seluruh file. Hal ini tidak terjadi di lingkungan pembangunan lokal. Sedangkan di server UNIX, tempat aplikasi saya dikerahkan, "akhir input" berbeda, yang menyebabkan masalah ini.

File f1 = new File(path);
     StringBuilder f2 = new StringBuilder();
        Scanner scanner = new Scanner(f1).useDelimiter("\\Z");

        while (scanner.hasNext()) {
           f2.append(scanner.next());

Ini menyelesaikan triknya. Saya tidak tahu tentang bagian kinerja pemindai (hanya mengambil 1024 karakter) bila dibandingkan dengan pembaca Mentega lainnya.

Solusi lain apa pun yang meningkatkan kinerja sangat dihargai.

person Pavan Sky    schedule 23.10.2013