2012-03-06 56 views
10

當我編組XML與此屬性JAXB:縮進元帥輸出XML在第一行

marshal.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); 
marshal.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 

它會產生在最高層

//Generate empty line break here  
<XX> 
    <YY> 
     <PDF>pdf name</PDF> 
     <ZIP>zip name</ZIP> 
     <RECEIVED_DT>received date time</RECEIVED_DT> 
    </YY> 
</XX> 
空換行符創建空換行符

我認爲原因是因爲marshal.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);,其中刪除<?xml version="1.0" encoding="UTF-8" standalone="yes"?>,在開始時離開輸出xml一個換行符。有沒有辦法來解決這個問題?我使用JAXB來與JDK 6,Moxy是否遭受這個問題?

+1

嘛。我試過Moxy JAXB,而MOxy不會遇到這個問題。很高興Moxy現在是Glassfish3.1.2的標準提供者。 Moxy什麼時候會成爲JDK的標準JAXB提供者? – 2012-03-06 20:12:27

+0

EclipseLink JAXB(MOXy)通過與參考實現相同的符合性測試,因此可以無憂使用我們(http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html) 。正如你指出的那樣,MOXY包含在GlassFish 3.1.2中(http://blog.bdoughan.com/2012/02/glassfish-312-is-full-of-moxy.html)。我們也是WebLogic 12c中的默認JAXB實現(http://blog.bdoughan.com/2011/12/eclipselink-moxy-is-jaxb-provider-in.html)。 – 2012-03-07 14:29:32

+0

我認爲JDK 7必須解決這個問題,因爲我似乎沒有這個問題。 – 2015-02-02 18:06:43

回答

2

正如你指出EclipseLink JAXB (MOXy)沒有這個問題,所以你可以用它(我的莫西鉛):

選項#1

一種選擇是使用java.io.FilterWriterjava.io.FilterOutputStream並將其自定義爲忽略前導新行。

選項#2

另一種選擇是,以元帥StAX的,並使用StAX的實現,它支持的格式輸出。我自己沒有嘗試過,但下面的鏈接建議使用com.sun.xml.txw2.output.IndentingXMLStreamWriter

0

因爲我正在召集到一個文件對象,我決定刪除此行算賬:

public static void removeEmptyLines(File file) throws IOException { 
    long fileTimestamp = file.lastModified(); 
    List<String> lines = Files.readAllLines(file.toPath()); 
    try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8))) { 
     for (String line : lines) { 
      if (!line.trim().isEmpty()) { 
       writer.write(line + "\n"); 
      } 
     } 
    } 
    file.setLastModified(fileTimestamp); 
}