2011-11-08 18 views
5

Ho un file XSD come di seguito:XSD - come definire relazione tra due elementi

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

file XML corrisponde al file XSD sopra è qui sotto:

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

Così, qui ho definito uno finder-def ie circleFinder e quindi si desidera fare riferimento a questo elemento finder-def tramite finder.

Quindi la domanda è come posso confermare che findercircleFinder ha il suo defination sopra definito in finder-def

+0

Fornire un .xml valido e compltete e un campione XSD valido e completo. – FailedDev

risposta

2

Solo un altro modo di utilizzare i tipi di ID e IDREF all'interno dello schema. Esempio: XML di esempio:

<?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> 

schema XSD (ho formattato un po 'per convalidare)

<?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 - Un problema nell'approccio precedente è che ora le classi java generate dal suddetto XSD usando JAXB hanno la proprietà 'name' di tipo 'Object' invece di 'String'. E stavo usando quelle lezioni generate in vari posti. Quindi c'è un altro modo per questo? –

+0

+1 - Per ulteriori informazioni su JAXB e '@ XmlID' /' @ XmlIDREF' vedere: http://blog.bdoughan.com/2010/10/jaxb-and-shared-references-xmlid-and.html –

+0

Marca "nome" come da stringa di tipo e aggiungere un altro "ref" di tipo IDREF. Inoltre è possibile aggiungere un elemento interno di tipo IDREF per l'elemento "finder" e aggiungere un'annotazione JAXB ad esso XSD: annotation-> xsd: appinfo-> JAXB: proprietà-> JAXB: BaseType valore com.test.finder.finder-def in modo tale che l'elemento sia di tipo corretto dopo la generazione della classe xsd-java. –

Problemi correlati