【问题标题】:Marshalling in java using JAXB使用 JAXB 在 Java 中编组
【发布时间】:2016-06-16 14:47:45
【问题描述】:

我需要使用 JAXB 制作如下所示的 xml,但我无法在 <result> 标记下获得 <front><back>

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

我可以得到&lt;response&gt; 但不是&lt;result&gt; 我正在使用类似的东西 -

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

我需要 &lt;front&gt;&lt;back&gt;&lt;result&gt; 内。请帮忙

【问题讨论】:

标签: java xml xml-parsing jaxb marshalling


【解决方案1】:

我想你的问题是在Output 类中,或者通过向我们的输出对象添加一个新的结果实例......顺便说一下,你是手动创建 java 绑定,还是 lat JaxB 从模式生成它?

我建议你采取以下步骤:

  1. 创建与您的 XML 匹配的架构(XSD 文件)
  2. 让 JaxB 生成 java 绑定
  3. 写入文件

对于Schema,我创建了以下一个(更正标签“containimage”的拼写)

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

等一下 :)

【讨论】:

  • 感谢您的信息,我一定会试试这个。另外,有没有办法使用 xml 注释来解决这个问题?
  • 上述建议效果很好:)..我还需要你的建议,目前一个 ObjectFactory 与单个 xml 格式相关联,现在我可以为不同格式的不同 xml 生成单个 ObjectFactory 吗?跨度>
  • ObjectFactory 对象被“链接”到一个 XML 模式。我个人为每个 XML Schema 使用一个专用的 java 包。这样,思想是一致的和稳健的。当需要调整时,更新模式,生成绑定(覆盖之前的)。我认为您应该看看如何为您的案例定义 XSD 文件。这些教程真的很好:w3schools.com/xml/schema_intro.asp
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
  • 2012-11-14
  • 2016-01-26
  • 1970-01-01
相关资源
最近更新 更多