XML ไม่ได้ถูกสปูลลงในไฟล์อย่างสมบูรณ์หลังจากการจัดเรียง

ฉันกำลังพยายามจัดเรียงวัตถุและแทนที่ถ่านที่ไม่ถูกต้องบางส่วนหลังจากนั้น ในกระบวนการนี้ xml ที่เสร็จสมบูรณ์ไม่ได้รับการสร้าง ฉันเห็นเพียง 1,024 ตัวอักษรในไฟล์ที่สร้างขึ้นทั้งหมด

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;
    }
}

มีการจำกัดการแทนที่สตริงหรือไม่
ฉันสร้างไฟล์ผิดวิธีหรือไม่

บันทึก:

ฉันกำลังจัดเก็บไฟล์ไว้ในโฟลเดอร์บันทึกของ UNIX
ฉันมี java 6, JAXB 2.2

ความช่วยเหลือใด ๆ ที่ชื่นชมอย่างมาก


person Pavan Sky    schedule 23.10.2013    source แหล่งที่มา
comment
บางที new Scanner(Source).useDelimiter(\\Z).next() ส่งคืนข้อมูลเพียง 1,024 ไบต์ ทำ marshal ใน ByteArrayInputStream จากนั้นสร้าง String จากนั้นเรียกเมธอดการแทนที่ () เพื่อทำการแทนที่ จากนั้นบันทึก String ลงในไฟล์ของคุณ   -  person Stanislav Mamontov    schedule 23.10.2013
comment
ขอบคุณ @Stanislav Mamontov แต่ฉันรู้สึกว่ามันสแกนไฟล์อินพุตและคัดลอกลงในสตริง ยังไงผมจะตรวจสอบและติดต่อกลับครับ   -  person Pavan Sky    schedule 23.10.2013
comment
เห็นปัญหาเดียวกันนี้ในบล็อกอื่นๆ โดยบอกว่า เพราะการอ่านครั้งเดียวโดยมี "/z" เป็นตัวคั่นควรอ่านทุกอย่างจนกระทั่ง "สิ้นสุดอินพุต" จึงอยากอ่านแค่ครั้งเดียวแล้วปล่อยไว้อย่างนั้น ดังตัวอย่างที่แสดงไว้ เหนือสิ่งอื่นใดทำ ในกรณีส่วนใหญ่ ก็ไม่เป็นไร แต่ฉันพบสถานการณ์อย่างน้อยหนึ่งสถานการณ์ที่การอ่านถึง "จุดสิ้นสุดของอินพุต" ไม่ได้อ่านอินพุตทั้งหมด - เมื่ออินพุตเป็น SequenceInputStream แต่ละองค์ประกอบ InputStreams ดูเหมือนจะให้ "จุดสิ้นสุดที่แยกจากกัน ของการป้อนข้อมูล” ของตัวเอง   -  person Pavan Sky    schedule 23.10.2013


คำตอบ (3)


เพียงตรวจสอบว่าคุณใส่คำอธิบายประกอบวัตถุของคุณด้วยคำอธิบายประกอบ jaxb อย่างถูกต้องหรือไม่ และเหตุใดคุณจึงตั้งค่าคุณสมบัติ Marshaller? คุณต้องการใช้สคีมาภายนอกเพื่อจัดวางวัตถุของคุณหรือไม่? ทำไมคุณไม่ปล่อยให้ jaxb ดูแลสิ่งเหล่านั้นทั้งหมดแทน (หากวัตถุของคุณมีอยู่ในพื้นที่ทำงานเดียวกัน)

โปรแกรมตัวอย่างนี้อาจเป็นประโยชน์กับคุณ http://www.mkyong.com/java/jaxb-hello-world-example/

และตรวจสอบสิ่งนี้ด้วย ..

JAXB Marshaller : เอาต์พุต StringWriter มีค่าแท็กที่ถูกตัดทอน truncated-tag-value

person Bhanu Prasad Vellanki    schedule 23.10.2013
comment
เราจำเป็นต้องมีคำนำหน้าที่กำหนดเองสำหรับแต่ละองค์ประกอบที่อินเทอร์เฟซอื่นคาดหวัง ซึ่งสร้างขึ้นเพื่อตั้งค่าคุณสมบัติ marshaller มาถึงปัญหาของเราแล้ว นี่ไม่ใช่เพราะ marshaller อย่างที่ @Stanislav Mamontov กล่าว ในสภาพแวดล้อมที่แตกต่างกัน เครื่องสแกนจะทำงานในรูปแบบที่แตกต่างกัน ทำให้ xml ที่สร้างขึ้นทั้งหมดถูกตัดทอนเหลือ 1,024 อักขระ - person Pavan Sky; 23.10.2013

เมื่อคุณเปิด FileOutputStream คุณจะต้องรับผิดชอบในการปิด คุณควรเปลี่ยนรหัสของคุณเพื่อรวมการโทร close()

    FileOutputStream fi = new FileOutputStream(Source);
    fi.write(xml_string.getBytes());
    fi.close();
person bdoughan    schedule 23.10.2013
comment
ขอบคุณสำหรับการเตือนโพสต์ ฉันได้รับมันก่อนหน้านี้และได้ปิดสตรีมแล้ว - person Pavan Sky; 23.10.2013
comment
@PavanSky - มันควรจะ - person bdoughan; 24.10.2013

ปัญหาเกิดขึ้นกับสแกนเนอร์ ซึ่งพยายามค้นหา EOF และไม่สพูลไฟล์ทั้งหมด สิ่งนี้ไม่ได้เกิดขึ้นในสภาพแวดล้อมการพัฒนาท้องถิ่น เช่นเดียวกับในเซิร์ฟเวอร์ UNIX ที่แอปพลิเคชันของฉันถูกปรับใช้ "จุดสิ้นสุดของอินพุต" นั้นแตกต่างออกไป ซึ่งทำให้เกิดปัญหานี้

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

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

นี่เป็นการเสร็จสิ้นเคล็ดลับ ฉันไม่รู้เกี่ยวกับประสิทธิภาพของสแกนเนอร์ (กินเวลาเพียง 1,024 ตัวอักษร) เมื่อเปรียบเทียบกับ Buttered reader อื่นๆ

โซลูชันอื่นใดที่ปรับปรุงประสิทธิภาพนั้นได้รับการชื่นชมอย่างมาก

person Pavan Sky    schedule 23.10.2013