2011-11-08 46 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-defcircleFinder然後想要參考這個finder-deffinder元素。

所以,問題是我如何可以驗證findercircleFinder具有上述finder-def

+0

提供有效和compltete .XML和一個有效且完整的.xsd樣品。 – FailedDev

回答

2

只是另一種方式利用內部架構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 - 上述方法中的一個問題是,現在使用JAXB從上述XSD生成的java類具有類型爲'Object'而不是'String'的'name'屬性。我在不同的地方使用這些生成的類。那麼有沒有其他的方法呢? –

+0

+1 - 有關JAXB和'@ XmlID' /'@ XmlIDREF'的更多信息,請參閱:http://blog.bdoughan.com/2010/10/jaxb-and-shared-references-xmlid-and.html –

+0

Make 「name」作爲字符串類型並添加IDREF類型的另一個元素「ref」。你也可以爲「finder」元素添加IDREF類型的內部元素,併爲其添加一個jaxb註解。這樣xsd-java類生成後元素纔是正確的類型。 –