2011-11-08 28 views
5

二つの要素間の関係を定義する方法:XSDは - 私は、XSDファイルの以下のように持って

<element name="finder-def" minOccurs="0" maxOccurs="unbounded"> 
    <complexType> 
     <attribute name="name" type="string" use="required"></attribute> 
     <attribute name="description" type="string"></attribute> 
     <attribute name="class" type="string" use="required"></attribute> 
    </complexType> 
</element> 

<complexType name="Dimension"> 
    <sequence> 
     <element name="finder" type="Finder" minOccurs="0" maxOccurs="1"/> 
    </sequence> 
</complexType> 

<complexType name="Finder"> 
    <attribute name="name" type="String" use="required"/> 
</complexType> 

XMLファイルは、上記のXSDファイルに対応する以下の通りです:

<finder-def name="circleFinder" description="Finds circle based on msisdn" class="com.onmobile.reporting.etl.processor.common.propertyplugins.CircleIdPropertyPlugin" /> 

<dimension name="circleId"> 
    <finder name="circleFinder" /> 
</dimension> 

だから、ここで私が定義されていますfinder-def、つまりcircleFinderとし、このfinder-deffinder要素を参照してください。

そこで問題は、私はfindercircleFinderfinder-def

+0

が有効とcompltete .xmlファイルと有効かつ完全なの.xsdのサンプルを提供します。 – FailedDev

答えて

2

上で定義されたそのdefinationスキーマ内のIDとIDREF型を使用するだけで別の方法を持っていることを検証するにはどうすればよいです。 例: サンプルXML:

<?xml version="1.0" encoding="UTF-8"?> 
<f:root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:f="http://test.com/finder" xsi:schemaLocation="http://test.com/finder finder.xsd"> 

<f:finder-def name="circleFinder" description="Finds circle based on msisdn" 
       class="com.onmobile.reporting.etl.processor.common.propertyplugins.CircleIdPropertyPlugin"/> 

<f:dimension name="circleId"> 
    <f:finder name="circleFinder"/> 
</f:dimension> 
</f:root> 

XSDスキーマ(私はそれを検証するためのビットをフォーマットしました)

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     targetNamespace="http://test.com/finder" 
     xmlns:tns="http://test.com/finder" 
     elementFormDefault="qualified" attributeFormDefault="unqualified"> 
<xsd:element name="root"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element name="finder-def" type="tns:finder-def" minOccurs="0" maxOccurs="unbounded"/> 
      <xsd:element name="dimension" type="tns:Dimension" minOccurs="0" maxOccurs="unbounded"/> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 
<xsd:complexType name="finder-def"> 
    <xsd:attribute name="name" type="xsd:ID" use="required"/> 
    <xsd:attribute name="description" type="xsd:string"/> 
    <xsd:attribute name="class" type="xsd:string" use="required"/> 
</xsd:complexType> 
<xsd:complexType name="Dimension"> 
    <xsd:sequence> 
     <xsd:element name="finder" type="tns:Finder" minOccurs="0" maxOccurs="1"/> 
    </xsd:sequence> 
    <xsd:attribute name="name" type="xsd:string"/> 
</xsd:complexType> 
<xsd:complexType name="Finder"> 
    <xsd:attribute name="name" type="xsd:IDREF" use="required"/> 
</xsd:complexType> 
</xsd:schema> 
+0

@Viktor +1 - 上記のアプローチの1つの問題は、JAXBを使用して上記のXSDから生成されたJavaクラスが 'String'の代わりに 'Object'タイプの 'name'プロパティを持つことです。私は様々な場所でこれらのクラスを使用していました。これには他の方法がありますか? –

+0

+1 - JAXBと '@XmlID' /' @XmlIDREF'の詳細については、http://blog.bdoughan.com/2010/10/jaxb-and-shared-references-xmlid-and.htmlを参照してください。 –

+0

タイプ文字列として "name"を指定し、タイプIDREFの別のelment "ref"を追加します。また、 "finder"要素にIDREF型の内部要素を追加し、それにjaxbアノテーションを追加することもできます。xsd:annotation-> xsd:appinfo-> jaxb:property-> jaxb:baseType value com.test.finder.finder-defその要素はxsd-javaクラスの生成後に正しい型になります。 –

関連する問題