2011-11-08 14 views
5

Tengo un archivo XSD, como a continuación:XSD - cómo definir la relación entre dos elementos

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

archivo XML corresponde al archivo XSD arriba es abajo:

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

lo tanto, aquí he definido uno finder-def es decir, circleFinder y luego desea hacer referencia a este elemento finder-def hasta finder.

Así que la pregunta es ¿Cómo puedo validar que findercircleFinder tiene su defination ha definido anteriormente en finder-def

+0

Proporcionar un .xml válido y compltete y una muestra .xsd válida y completa. – FailedDev

Respuesta

2

Apenas otra manera de utilizar ID y IDREF tipos dentro del esquema. Ejemplo: XML de ejemplo:

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

esquema XSD (He formateado un poco para validar)

<?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 en el enfoque anterior es que ahora las clases de Java generadas a partir del XSD anterior utilizando JAXB tienen la propiedad 'nombre' de tipo 'Objeto' en lugar de 'Cadena'. Y estaba usando esas clases generadas en varios lugares. Entonces, ¿hay alguna otra manera para esto? –

+0

+1 - Para obtener más información sobre JAXB y '@ XmlID' /' @ XmlIDREF', consulte: http://blog.bdoughan.com/2010/10/jaxb-and-shared-references-xmlid-and.html –

+0

Make "nombre" como de tipo cadena y agregue otro elemento "ref" de tipo IDREF. También puede agregar un elemento interno de tipo IDREF para el elemento "finder" y agregarle una anotación jaxb xsd: anotación-> xsd: appinfo-> jaxb: propiedad-> jaxb: valor baseType com.test.finder.finder-def para que ese elemento sea del tipo correcto después de la generación de la clase xsd-java. –

Cuestiones relacionadas