我在解析以下 xml 时遇到问题:
<ODM xmlns="http://www.cdisc.org/ns/odm/v1.3">
<Study OID="CDASH_Study_2011-10-24">
<GlobalVariables>
<StudyName>CDASH</StudyName>
<StudyDescription>CDASH Publication</StudyDescription>
<ProtocolName>CDASH</ProtocolName>
</GlobalVariables>
<MetaDataVersion OID="CDASH_MetaDataVersion_2011-10-24" Name="CDASH MDV">
<FormDef OID="F.AE_2011-10-24" Name="Adverse Event" Repeating="No">
<ItemGroupRef ItemGroupOID="IG.AEYN_2011-10-24" Mandatory="Yes"/>
</FormDef>
<ItemGroupDef OID="IG.AEYN_2011-10-24" Name="General information" Repeating="No">
<ItemRef ItemOID="AE_1_2011-10-24" Mandatory="Yes"/>
</ItemGroupDef>
<ItemDef OID="AE_1_2011-10-24" Name="Any AEs?" DataType="text" Length="1">
<Description>
<TranslatedText xml:lang="en">General prompt question...</TranslatedText>
</Description>
<Question>
<TranslatedText xml:lang="en">Any AEs?</TranslatedText>
</Question>
<Alias Context="CDASH" Name="AEYN"/>
</ItemDef>
</MetaDataVersion>
</Study>
</ODM>
正如您所看到的,XML 使用一种扁平树,其中 FormDef 元素包含 ItemGroupRef 元素,这些元素通过 OID 引用与 FormDef (MetaDataVersion) 存储在同一级别的 ItemGroupDef 元素。当然,我可以自己解析它,构建索引映射,然后根据需要将所有生成的类链接在一起,但是我想知道 JAXB 本身是否能够支持这一点。
我还想解码数据,而不为我不感兴趣的元素创建 JAXB 带注释的类。在我的特定情况下,我只对 MetaDataVersion 元素的内容感兴趣。我尝试简单地使用 FormDef 类进行解码,但这会引发以下异常:
javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.cdisc.org/ns/odm/v1.3", local:"ODM"). Expected elements are <{http://www.cdisc.org/ns/odm/v1.3}Study>
有什么想法吗?
非常感谢
一个
最佳答案
对于根标签<OMD>
@XmlRootElement(name = "ODM")
@XmlAccessorType(XmlAccessType.FIELD)
public class ODMTag
{
@XmlElement(name = "Study", namespace = "http://www.cdisc.org/ns/odm/v1.3")
StudyTag study;
}
对于子标签<Study>
@XmlType
@XmlAccessorType(XmlAccessType.FIELD)
public class StudyTag
{
@XmlAttribute(name = "OID")
String OID;
@XmlElement(namespace = "http://www.cdisc.org/ns/odm/v1.3")
MetaDataVersion MetaDataVersion;
}
对于标签<MetaDataVersion>
@XmlType
@XmlAccessorType(XmlAccessType.FIELD)
public class MetaDataVersion
{
@XmlAttribute(name = "OID")
String OID;
@XmlAttribute(name = "Name")
String name;
/**
* all other elements
*/
}
解码:
ODMTag odm = JAXB.unmarshal(new File(...), ODMTag.class)
关于java - 使用引用进行部分解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18609024/