2016-03-03 1 views
0

Мне нужно сделать xml, как показано ниже, используя JAXB, но я не могу получить <front> и <back> под тегом <result>.Marshalling in java using JAXB

<?xml version="1.0" encoding="UTF-8"?> 
<output> 
    <option>abc</option> 
    <refid>8789</refid> 
    <response> 
     <responsecode>1234</responsecode> 
     <responsedetails>xyz</responsedetails> 
    </response> 
    <result> 
     <front> 
     <containimage>Yes</ontainimage> 
     <containdetail>No</containdetail> 
     </front> 
     <back> 
     <ontainimage>Yes</ontainimage> 
     <containdetail>Yes</containdetail> 
     </back> 
    </result> 
</output> 

Я смог получить <response> но не <result> я использую что-то вроде -

@XmlElementWrapper(name = "result") 
@XmlElement 
public ArrayList<Front> getFront() { 
    return front; 
} 
@XmlElementWrapper(name = "result") 
@XmlElement 
public ArrayList<Back> getBack() { 
    return back; 
} 

и получить XML в качестве

<?xml version="1.0" encoding="UTF-8"?> 
    <output> 
     <option>abc</option> 
     <refid>8789</refid> 
     <response> 
      <responsecode>1234</responsecode> 
      <responsedetails>xyz</responsedetails> 
     </response> 
     <result> 
      <front> 
      <containimage>Yes</ontainimage> 
      <containdetail>No</containdetail> 
      </front> 
     </result> 
     <result> 
      <back> 
      <ontainimage>Yes</ontainimage> 
      <containdetail>Yes</containdetail> 
      </back> 
     </result> 
    </output> 

мне нужно <front> и <back> внутри <result> , Пожалуйста, помогите

+0

Вы можете создать 'result' POJO, который содержит как' 'front' и back' POJO – kirsty

+0

Возможный дубликат http://stackoverflow.com/questions/4889913/jaxb2-mapping-nested-elements-into-the-same-java-class – kirsty

ответ

1

Я полагаю, что проблема в классе Output или добавление нового экземпляра результата к нашему выходному объекту ... Кстати, вы вручную создаете привязку java, или lat JaxB генерирует его из схема?

Я предлагаю вам следующие шаги:

  1. создать схему (файл XSD), которые соответствуют вашему XML
  2. позволить JAXB генерировать Java связывания
  3. написать файл

Для в схеме я создал следующую (исправление наложения тега «containsimage»)

<?xml version="1.0"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<xsd:element name="output"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element name="option" type="xsd:string" /> 
      <xsd:element name="refid" type="xsd:string" /> 
      <xsd:element name="response"> 
       <xsd:complexType> 
        <xsd:sequence> 
         <xsd:element name="responsecode" type="xsd:string" /> 
         <xsd:element name="responsedetails" type="xsd:string" /> 
        </xsd:sequence> 
       </xsd:complexType> 
      </xsd:element> 
      <xsd:element name="result" maxOccurs="1"> 
       <xsd:complexType> 
        <xsd:sequence> 
         <xsd:element name="front" type="resultType" /> 
         <xsd:element name="back" type="resultType" /> 
        </xsd:sequence> 
       </xsd:complexType> 
      </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 

<xsd:complexType name="resultType"> 
    <xsd:sequence> 
     <xsd:element name="containimage" type="xsd:string" /> 
     <xsd:element name="containdetail" type="xsd:string" /> 
    </xsd:sequence> 
</xsd:complexType> 

Затем я спросил JAXB генерировать Java связывания (Wizzard в Eclipse), который генерирует мне 3-х классов: ObjectFactory, Output и ResultType классы.

Наконец, я могу написать файл вывода:

package stackoverflow35769423; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.OutputStream; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Marshaller; 

import stackoverflow35769423.jaxb.ObjectFactory; 
import stackoverflow35769423.jaxb.Output; 
import stackoverflow35769423.jaxb.ResultType; 

public class CreateResultFile { 

    public static void main(String[] args) {  
     try { 
      (new CreateResultFile()).writeFile(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (JAXBException e) { 
      e.printStackTrace(); 
     } 
    } 

    private void writeFile() throws JAXBException, FileNotFoundException { 
     OutputStream os = new FileOutputStream("files" + File.separator + "output.xml"); 
     ObjectFactory factory = new ObjectFactory(); 
     JAXBContext jaxbContext = JAXBContext.newInstance(factory.getClass().getPackage().getName()); 
     Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 
     jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 

     Output output = factory.createOutput(); 
     output.setOption("abc"); 
     output.setRefid("8789"); 

     Output.Response reponse = factory.createOutputResponse(); 
     reponse.setResponsecode("1234"); 
     reponse.setResponsedetails("xyz"); 
     output.setResponse(reponse); 

     Output.Result result = factory.createOutputResult(); 
     ResultType resultFront = factory.createResultType(); 
     resultFront.setContainimage("Yes"); 
     resultFront.setContaindetail("No"); 

     ResultType resultBack = factory.createResultType(); 
     resultBack.setContainimage("Yes"); 
     resultBack.setContaindetail("Yes"); 

     result.setFront(resultFront); 
     result.setBack(resultBack); 
     output.setResult(result); 

     jaxbMarshaller.marshal(output, os); 
    } 
} 

вуаля :)

+0

Спасибо за информацию, я обязательно попробую это. Кроме того, есть ли способ работать с XML-аннотациями? –

+0

Вышеприведенное предложение сработало хорошо :) .. Мне нужен еще один совет от вас, в настоящее время один ObjectFactory связан с одним xml-форматом, теперь я могу создать единый ObjectFactory для разных xml с разными форматами? –

+0

Объект ObjectFactory «привязан» к одной схеме XML. Я лично использую выделенный пакет java для каждой схемы XML. Таким образом, мышление является последовательным и надежным. Когда требуется адаптация, обновите схему, позвольте связыванию быть сгенерированным (переопределяя предыдущий). Я думаю, вам нужно посмотреть, как определить файл XSD для ваших случаев. Этот учебник действительно хорош: http://www.w3schools.com/xml/schema_intro.asp –

 Смежные вопросы

  • Нет связанных вопросов^_^