1

期待される XML としてコードをマーシャリングする際に問題があります

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 を使用して、デフォルトで必要なタグを出力しました。ただし、すべての書き込みステートメントは、最後の開始タグ、開始要素にも出力されます。

生成される出力は次のとおりです。

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

4

1 に答える 1

2

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 出力のフォーマットについては、次の質問に対する回答を参照してください。

于 2013-03-30T10:01:13.573 に答える