2011-11-08 29 views
5

iki unsurları arasındaki ilişkiyi tanımlamak için nasıl:XSD - Bir XSD dosyası aşağıdan gibi var

<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 dosyası yukarıdaki XSD dosyasına karşılık gelen aşağıdaki gibidir:

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

Yani, burada ben tanımladığınız Bir finder-def yani circleFinder ve sonra finder elemanından finder-def'a başvurmak istersiniz.

Yani soru Ben finder circleFinder onun tanımı şema içindeki kimliği ve IDREF türlerini kullanmak finder-def

+0

geçerli ve compltete .xml ve geçerli ve tam bir .Xsd örneği sağlayın (ı doğrulamak için bunu biraz biçimlendirilmiş ettik). – FailedDev

cevap

2

yılında Bir başka şekilde yukarıda tanımlandığı sahip olduğunu doğrulamak nasıl olduğunu. Örnek: Örnek 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 şeması

<?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 - Yukarıdaki yaklaşımın bir problemi, JAXB kullanılarak yukarıdaki XSD'den oluşturulan java sınıflarının 'String' yerine 'Object' türünde 'name' özelliğine sahip olmasıdır. Ve bu oluşturulan sınıfları çeşitli yerlerde kullanıyordum. Bunun için başka bir yolu var mı? –

+0

+1 - JAXB ve '@ XmlID' /' @ XmlIDREF 'hakkında daha fazla bilgi için bkz: http://blog.bdoughan.com/2010/10/jaxb-and-shared-references-xmlid-and.html –

+0

type dizgisi olarak "name" ve IDREF türünde başka bir "ref" elkitabı ekleyin. Ayrıca "finder" öğesi için IDREF türünde bir iç eleman ekleyebilir ve ona bir jaxb ek açıklaması ekleyebilirsiniz. Xsd: annotation-> xsd: appinfo-> jaxb: property-> jaxb: baseType value com.test.finder.finder-def Böylece eleman xsd-java sınıf neslinden sonra doğru tipte olacaktır. –