【问题标题】:Partial unmarshalling with references使用引用进行部分解组
【发布时间】:2013-09-04 08:34:22
【问题描述】:

我在解析以下 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 引用存储在与 FormDefs (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>

有什么想法吗?

非常感谢

一个

【问题讨论】:

    标签: java xml jaxb unmarshalling


    【解决方案1】:

    对于根标签&lt;OMD&gt;

    @XmlRootElement(name = "ODM")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class ODMTag
    {
       @XmlElement(name = "Study", namespace = "http://www.cdisc.org/ns/odm/v1.3")
       StudyTag study;
    }  
    

    对于子标签&lt;Study&gt;

    @XmlType
    @XmlAccessorType(XmlAccessType.FIELD)
    public class StudyTag 
    {
       @XmlAttribute(name = "OID")
       String OID;
    
       @XmlElement(namespace = "http://www.cdisc.org/ns/odm/v1.3")
       MetaDataVersion MetaDataVersion;
    }  
    

    对于标签&lt;MetaDataVersion&gt;

    @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)
    

    【讨论】:

    • 所以你是说我不能跳过 ODMTag 和 StudyTag?
    • @AnthonyWebster 你可以,就像在 Blaise Doughan 的回答中一样。你可以喜欢我的回答。一切皆有可能。
    【解决方案2】:

    您可以在 XML 上创建 StAX XMLStreamReader。然后将XMLStreamReader 推进到MetaDataVersion 元素并从那里解组。

    【讨论】:

    • 太好了,谢谢!我不太确定如何进行设置,以便 ItemGroupREF 指向 ItemGroupDEF 以解析到包含 ItemGroups 列表的域。任何指针将不胜感激!
    猜你喜欢
    • 2013-05-30
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多