1

次の 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 要素には、FormDef (MetaDataVersion) と同じレベルに格納されている ItemGroupDef 要素を OID で参照する ItemGroupRef 要素が含まれています。もちろん、これを自分で解析して、インデックス マップを作成し、生成されたすべてのクラスを必要に応じてリンクすることもできますが、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>

何か案は?

どうもありがとう

4

2 に答える 2

0

ルートタグの場合<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)
于 2013-09-04T09:29:55.003 に答える
0

XMLStreamReaderXMLで StAX を作成できます。次にXMLStreamReaderMetaDataVersion要素に進み、そこから非整列化します。

于 2013-09-04T09:52:23.767 に答える