2016-04-11 12 views
1

Farklı ortamların yapılandırma durumlarını karşılaştırmak için JAXB marshalled XML dosyalarını kullanan bir projem var. Unix versiyonuna karşı Windows altında JAXB marshaller uygulamasında bazı farklılıklar olması gerektiğini fark ettim. Farklı platformlarda oluşturulan 2 dosyayı karşılaştırdığımda, karşılaştırma aracım her zaman dosyanın sonunda bir fark işaretler. Windows'da oluşturulan dosya, dosyanın sonunda Unix sürümünde bulunmayan yeni bir satıra (CR ve LF) sahiptir.Windows üzerinde Marshaller, dosyanın sonuna yeni satır ekler

Sorun, her iki platform arasındaki yeni satır karakterlerinin farkı hakkında değil, olduğunu unutmayın! Windows marshaller, dosyanın sonunda "yeni bir satır" ekler ve Unix marshaller kök etiketinin ">" kapanmasından sonra durur.

Windows marshaller adds a new line at the end

mi orada ben bu ek çizgiyi önlemek amacıyla Marshaller geçmek yoksa benim karşılaştırma aracı flag fark etmez, böylece açıkça, Windows üzerinde sıralanırken sonra kaldırmak zorunda yapabilirim herhangi bir parametre ?

public void marshal(final Object rootObject, final OutputStream outputStream) throws JAXBException, TransformerException { 
    Preconditions.checkArgument(rootObject != null, "rootObject must not be null"); 
    Preconditions.checkArgument(outputStream != null, "outputStream must not be null"); 
    final JAXBContext ctx = JAXBContext.newInstance(rootObject.getClass()); 
    final Document document = getFactories().newDocument(); 
    document.setXmlStandalone(true); 
    final Marshaller marshaller = ctx.createMarshaller(); 
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
    marshaller.setSchema(schema); 
    marshaller.marshal(rootObject, document); 
    createTransformer().transform(new DOMSource(document), new StreamResult(outputStream)); 
    } 

    public static Transformer createTransformer() { 
    final Transformer transformer = getFactories().newTransformer(); 
    transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
    transformer.setOutputProperty(OutputKeys.STANDALONE, "yes"); 
    transformer.setOutputProperty(OutputKeys.ENCODING, JAXBDefaults.OUTPUT_CHARSET.name()); 
    transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, CDATA_XML_ELEMENTS); 
    transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", IDENT_LENGTH); 
    return transformer; 
    } 


    private static class JAXBFactories { 

    private DocumentBuilderFactory documentBuilderFactory; 

    public DocumentBuilderFactory getDocumentBuilderFactory() { 
     if (documentBuilderFactory == null) { 
     documentBuilderFactory = DocumentBuilderFactory.newInstance(); 
     } 
     return documentBuilderFactory; 
    } 

    private DocumentBuilder documentBuilder; 

    public DocumentBuilder getDocumentBuilder() { 
     if (documentBuilder == null) { 
     try { 
      documentBuilder = getDocumentBuilderFactory().newDocumentBuilder(); 
     } catch (final ParserConfigurationException ex) { 
      throw new RuntimeException("Failed to create DocumentBuilder", ex); 
     } 
     } 
     return documentBuilder; 
    } 

    public Document newDocument() { 
     return getDocumentBuilder().newDocument(); 
    } 

    private TransformerFactory transformerFactory; 

    public TransformerFactory getTransformerFactory() { 
     if (transformerFactory == null) { 
     transformerFactory = TransformerFactory.newInstance(); 
     } 
     return transformerFactory; 
    } 

    public Transformer newTransformer() { 
     try { 
     return getTransformerFactory().newTransformer(); 
     } catch (final TransformerConfigurationException ex) { 
     throw new RuntimeException("Failed to create Transformer", ex); 
     } 
    } 

    } 

    private static class FactoriesHolder { 

    static final JAXBFactories FACTORIES = new JAXBFactories(); 
    } 

    private static JAXBFactories getFactories() { 
    return FactoriesHolder.FACTORIES; 
    } 

cevap

1

oldukça baskı XML tam olarak iki farklı sistemlerden aynı sonuçları üretecek hiçbir sebep (veya beklenti) yoktur:

Bu gibi manevra kodu böyle görünüyor. Bununla birlikte, güzel baskıyı kapatırsanız (ve IDE/düzenleyicinizin bunu yapmasına izin verirseniz) çıktının aynı olduğunu fark etmeniz muhtemeldir.

Güzel yazdırma XML, düzen ekleyen orijinalin bir dönüşümüdür. Artık gerçek xml değil.

+0

Cevabınız için teşekkürler! Ben tam anlamıyla anladım.Ancak, benim sorunum, XML'i seçmemin ana nedenlerinden birinin, sunduğu tüm okunabilirlik ve herhangi bir karşılaştırma aracıyla kolayca karşılaştırma olanağı olmasıydı. Artık bu ekstra satır nedeniyle, birden fazla dosyayı bir kerede karşılaştırırken çok fazla yanlış fark elde ediyorum. XML karşılaştırması için iyi bir araç tanımıyorsunuz değil mi? :) Düz metin karşılaştırması şimdilik işe yaradı, ancak bu yeni satır sorunundan başka birçok sorun var. – Alex

+0

@Alex - [KDiff] (http://kdiff3.sourceforge.net/) karşılaştırırken beyaz boşlukları görmezden geldiği söylenebilir. Bu, tüm sorunları çözmez, ancak çok yardımcı olur. – OldCurmudgeon

İlgili konular