使用类似的包装器解组多个 XML

问题描述 投票:0回答:1
java xml jaxb
1个回答
0
投票

是的,可以解组包含由具有不同值的给定属性区分的不同内容的 XML 实例。

这里是一个独立的 Maven 演示 projectzip,它使用这些 JAXB 功能来提供解决方案:

  • @XmlJavaTypeAdapter(MethodXmlAdapter.class)
    - 用于指定类以提供自定义 unmarshallermarshaller 方法的 JAXB 注释。
  • MethodXmlAdapter.class
    - 在解组 method 元素时从 JAXB 接收 DOM
     
    Element
    Element
    实例用于将区别名称读取为 DOM 属性。封送时,JAXB 提供要在适配器中封送的
    MethodXXN
    实例,以返回 DOM
    Element
    表示形式。

解组的关键点是可以通过编程方式访问区分属性,并且可以将 DOM 元素解组为所需的 Java 类型。

Context.mainUnmarshalByName(...)

public static Object mainUnmarshalByName(Element element)
{
    Object value = null;
    String name = element.getAttribute("name");
    switch (name)
    {
        case "platce-info":
            value = mainUnmarshal(element, METHODXX1_CLASS);
            break;
        case "platce-data":
            value = mainUnmarshal(element, METHODXX2_CLASS);
            break;
        default:
            value = element;
            break;
    }
    return value;
}

编组的关键点是可以使用声明的

QName
(带或不带命名空间)将不同的 MethodXXN 实例编组到一个 method 元素。

Context.mainWrapAsMethod(...)

@SuppressWarnings({ "rawtypes", "unchecked" })
public static Object mainWrapAsMethod(Object value)
{
    Object wrap = null;
    if ( value != null )
    {
        if ( isJAXBElement(value) )
            value = ((JAXBElement) value).getValue();

        if ( METHODXX1_CLASS.equals(value.getClass()) )
            wrap = new JAXBElement(METHOD_QNAME, METHODXX1_CLASS, value);
        else if ( METHODXX2_CLASS.equals(value.getClass()) )
            wrap = new JAXBElement(METHOD_QNAME, METHODXX2_CLASS, value);
    }
    return wrap;
}

实施

示例项目使用 HiSrc HighJAXB Maven 插件和来自 HiSrc BasicJAXB 的 XJC 插件生成 JAXB 类。 XML 模式将

MethodXXN
类型定义为
MethodBase
的子类型,其中包含公共属性和元素。

XJC从platce.xsd生成的类

org
└── example
    └── platce
        ├── MethodBase.java
        ├── MethodXX1.java
        ├── MethodXX2.java
        ├── ObjectFactory.java
        ├── Response.java
        └── VeraWSClass.java

platce.xsd 模式定义了

VeraWSClass
类型来保存 any 元素;但是,HiSrc HighJAXB Maven 插件使用 HiSrc BasicJAXB 自定义 XJC 插件和 HiSrc HyperJAXB Annox 注释 XJC 插件,使用单独的配置文件:
VeraWSClass.any 添加 
@XmlAnyElement
@XmlJavaTypeAdapter 注释。 xml.

执行

对于演示,您可以使用以下方式运行测试和/或应用程序:

mvn -Ptest clean test
mvn -Pexec compile exec:java -Dexec.args="src/test/samples/response01.xml"
mvn -Pexec compile exec:java -Dexec.args="src/test/samples/response02.xml"

免责声明:我是分叉的 HiSrc BasicJAXBHiSrc HighJAXBHiSrc HyperJAXB Annox 项目的维护者。

© www.soinside.com 2019 - 2024. All rights reserved.