是的,可以解组包含由具有不同值的给定属性区分的不同内容的 XML 实例。
这里是一个独立的 Maven 演示 project 和 zip,它使用这些 JAXB 功能来提供解决方案:
@XmlJavaTypeAdapter(MethodXmlAdapter.class)
- 用于指定类以提供自定义 unmarshaller 和 marshaller 方法的 JAXB 注释。MethodXmlAdapter.class
- 在解组 method 元素时从 JAXB 接收 DOMElement
。 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 元素。
@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 BasicJAXB、HiSrc HighJAXB 和 HiSrc HyperJAXB Annox 项目的维护者。