【问题标题】:Moxy - Creating XML element with no corresponding Java PropertyMoxy - 创建没有相应 Java 属性的 XML 元素
【发布时间】:2013-05-30 14:35:45
【问题描述】:

我一直在使用 Moxy 成功地将复杂的 xml 类型编组/解组为更简单的 java 结构。特别是,我正在处理 ISO Pain 20022 消息,并且 XML 中存在许多我们不关心的字段:

<?xml version="1.0" encoding="UTF-8"?>
<iso:Document xmlns:iso="urn:iso:std:iso:20022:tech:xsd:pain.001.001.04" >
    <iso:CstmrCdtTrfInitn>
        <iso:GrpHdr>
           <iso:MsgId>OriginalMessageID</iso:MsgId>
            <iso:CreDtTm>2013-05-29T20:02:22.615</iso:CreDtTm>
            <iso:NbOfTxs>1</iso:NbOfTxs>
            <iso:InitgPty/>
        </iso:GrpHdr>
       <iso:PmtInf>
...
</iso:Document>

这是我的 oxm 绑定文件片段:

<xml-element java-attribute="messageId" xml-path="iso:CstmrCdtTrfInitn/iso:GrpHdr/iso:MsgId/text()"/>
<xml-element java-attribute="creationDateTime" xml-path="iso:CstmrCdtTrfInitn/iso:GrpHdr/iso:CreDtTm/text()"/>

我需要生成额外的两个 xml 元素 iso:NbOfTxsiso:InitgPty 将始终相同,并且在 java 上没有对应的属性生成 xml 的类。

这可能吗?

谢谢。

【问题讨论】:

标签: xml-serialization marshalling moxy


【解决方案1】:

我仍在研究这个用例。以下是我目前能够生成的 XML(我知道它不正确)。

输出

<?xml version="1.0" encoding="UTF-8"?>
<iso:Document xmlns:iso="urn:iso:std:iso:20022:tech:xsd:pain.001.001.04">
   <iso:CstmrCdtTrfInitn>
      <iso:GrpHdr>
         <iso:MsgId>OriginalMessageID</iso:MsgId>
      </iso:GrpHdr>
   </iso:CstmrCdtTrfInitn>
   <iso:CstmrCdtTrfInitn>
      <iso:GrpHdr>
         <iso:CreDtTm>2013-05-29T20:02:22.615</iso:CreDtTm>
         <iso:NbOfTxs>1</iso:NbOfTxs>
         <iso:InitgPty/>
      </iso:GrpHdr>
   </iso:CstmrCdtTrfInitn>
</iso:Document>

文档

以下是您的域模型的简化版本:

import java.util.Date;

public class Document {

    private String messageId;

    private Date creationDateTime;
}

oxm.xml

在下面的元数据中,我尝试使用 XmlAdapterDate 属性转换为更复杂的对象,该对象可以写出其他 2 个 XML 元素。

<?xml version="1.0"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="forum16839007">
    <xml-schema
        namespace="urn:iso:std:iso:20022:tech:xsd:pain.001.001.04"
        element-form-default="QUALIFIED">
        <xml-ns prefix="iso" namespace-uri="urn:iso:std:iso:20022:tech:xsd:pain.001.001.04"/>
    </xml-schema>
    <java-types>
        <java-type name="Document" xml-accessor-type="FIELD">
            <xml-root-element name="Document"/>
            <java-attributes>
                <xml-element java-attribute="messageId" xml-path="iso:CstmrCdtTrfInitn/iso:GrpHdr/iso:MsgId/text()"/>
                <xml-element java-attribute="creationDateTime" xml-path=".">
                    <xml-java-type-adapter value="forum16839007.ExtraAdapter"/>
                </xml-element>
            </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>

额外适配器

这是将Date 转换为更复杂对象的XmlAdapter

import java.util.Date;
import javax.xml.bind.annotation.adapters.XmlAdapter;

import org.eclipse.persistence.oxm.annotations.XmlPath;

public class ExtraAdapter extends XmlAdapter<ExtraAdapter.Extra, Date>{

    public static class Extra {

        @XmlPath("iso:CstmrCdtTrfInitn/iso:GrpHdr/iso:CreDtTm/text()")
        public Date creationDateTime;

        @XmlPath("iso:CstmrCdtTrfInitn/iso:GrpHdr/iso:NbOfTxs/text()")
        public final int NbOfTxs = 1;

        @XmlPath("iso:CstmrCdtTrfInitn/iso:GrpHdr/iso:InitgPty/text()")
        public final Empty initgPty = new Empty();
    }

    public static class Empty {
    }

    @Override
    public Date unmarshal(Extra extra) throws Exception {
        return extra.creationDateTime;
    }

    @Override
    public Extra marshal(Date date) throws Exception {
        Extra extra = new Extra();
        extra.creationDateTime = date;
        return extra;
    }

}

演示

import java.io.File;
import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextProperties;

public class Demo {

    public static void main(String[] args) throws Exception {
        Map<String, Object> properties = new HashMap<String, Object>(1);
        properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "forum16839007/oxm.xml");
        JAXBContext jc = JAXBContext.newInstance(new Class[] {Document.class}, properties);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum16839007/input.xml");
        Document document = (Document) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(document, System.out);
    }

}

【讨论】:

  • 感谢 Blaise,您的总结很好地记录了我的课程。最后,我不得不恢复在模型类上添加一些额外的方法来克服这个困难。很高兴在 moxy 中看到这种功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多