2013-03-30 72 views
1

我和編組代碼預期XML問題JAXB輸出格式不正確

public void xmleg() throws XMLStreamException 
    { 


    XMLOutputFactory factory = XMLOutputFactory.newInstance(); 
    XMLStreamWriter writer = factory.createXMLStreamWriter(System.out); 
    writer.writeStartDocument(); 
    writer.writeStartElement("Zoos1"); 


     QName q=new QName("","Zoo"); 
     for(Zoo add: zoo_list) 
     { 
     try 
     { 

      JAXBContext jaxbContext = JAXBContext.newInstance(Zoos.class); 
       Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 



      jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true); 
      jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); 
      jaxbMarshaller.marshal(new JAXBElement<Zoot>(q,Zoo.class,add),System.out); 

     } catch (JAXBException e) { 
      e.printStackTrace(); 
       } 
     } 
     writer.writeEndDocument(); 
     writer.close(); 
     } 


} 

是否使用了XMLStreamWriter打印所需的default..But標籤的所有語句寫在最後的印刷開始標記,開始元素。

所生成的輸出是:

<Zoo> 
    <linkId>0</linkId> 
    <name>fjjfjfrj</name> 

</Zoo> 

<Zoo> 
    <linkId>0</linkId> 
    <name>fgjfjfj</name> 
</Zoo> 
<?xml version="1.0" ?><Zoos></Zoos> 

預期輸出應該是:

<?xml version="1.0" ?> 

<Zoo> 
    <linkId>0</linkId> 
    <name>fjjfjfrj</name> 
    </Zoo> 

<Zoo> 
    <linkId>0</linkId> 
    <name>fgjfjfj</name> 
</Zoo> 

回答

1

對於您使用StAX添加根元素的用例,您還需要具有JAXB元帥到XMLStreamWriter。當編組到文檔中間時,您需要確保您設置了JAXB_FRAGMENT屬性。下面是一個例子:

import javax.xml.bind.*; 
import javax.xml.stream.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Zoo.class); 
     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 

     XMLOutputFactory xof = XMLOutputFactory.newFactory(); 
     XMLStreamWriter xsw = xof.createXMLStreamWriter(System.out); 

     xsw.writeStartDocument(); 
     xsw.writeStartElement("zoos"); 

     Zoo zoo1 = new Zoo(); 
     zoo1.linkId = 1; 
     zoo1.name = "foo"; 
     marshaller.marshal(zoo1, xsw); 

     Zoo zoo2 = new Zoo(); 
     zoo2.linkId = 2; 
     zoo2.name = "bar"; 
     marshaller.marshal(zoo2, xsw); 

     xsw.writeEndElement(); 
     xsw.writeEndDocument(); 
     xsw.close(); 
    } 

} 

當編組到一個XMLStreamWriter輸出將不會被格式化。

<?xml version="1.0" ?><zoos><zoo><linkId>1</linkId><name>foo</name></zoo><zoo><linkId>2</linkId><name>bar</name></zoo></zoos> 

有關格式化的StAX輸出退房回答下列問題幫助: