java - 使用引用进行部分解码

标签 java xml jaxb unmarshalling

我在解析以下 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/

相关文章:

java - 如何从不知道其在Java中的级别的xml中获取节点

java - JAXB "grammar is not specified"

java - 是否可以通过 JAXB 2.2.x 解码非 XML 数据?

java - Long.toBinaryString 未返回 827.0 的预期二进制字符串

java - 如何缩短JSP中的数字?

xml - 不使用循环解析 XML 文件?

sql - 修改SQL Server中的xml元素名称

java - 如何在 Java 中拆分字符串,包括空格(就像在 Python 中一样)

java - 如何运行服务器的批处理文件(永久运行)并将控制权返回给java程序而不关闭该批处理

java - 在不同的类中创建 Camel 路线