JAXB输出格式不正确

问题描述:

我和编组代码预期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> 

对于您使用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输出退房回答下列问题帮助: