2016-03-03 88 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 –