2016-03-03 42 views
0

我需要使用JAXB製作如下的xml,但我無法在<result>標記下獲得<front><back>使用JAXB在java中進行編組

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

您可以創建一個包含一個'front'和'back' POJO – kirsty

+0

可能的複製了'result' POJO 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綁定(在Eclipse威澤德),產生了我3類:ObjectFactoryOutputResultType類。

最後,我可以寫輸出文件:

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); 
    } 
} 

的Et瞧:)

+0

感謝您的信息,我一定會嘗試這一點。另外,有沒有辦法使用xml註釋來解決這個問題? –

+0

以上建議工作良好:) ..我需要一個更多的建議,目前一個ObjectFactory鏈接到單個XML格式現在我可以生成一個單一的ObjectFactory爲不同的XML與不同的格式? –

+0

ObjectFactory對象「鏈接到」一個XML模式。我個人爲每個XML模式使用專用的Java包。通過這種方式,思考是一致的和強大的。當需要改編時,更新模式,讓綁定生成(覆蓋前一個)。我想你應該看看如何爲你的案例定義XSD文件。這些教程非常好:http://www.w3schools.com/xml/schema_intro.asp –