2014-06-17 146 views
1

我有下面的XML文檔,還挺簡單:與XSD架構掙扎

<configuration> 
    <group name="database"> 
     <server name="machine01" user="root" password="foob4r" sudo="true" hdd="300" loc="/opt" /> 
    </group> 
    <group name="application"> 
     <server name="machine01" user="root" password="foob4r" sudo="true" hdd="50" loc="/export" /> 
     <server name="machine02" user="root" password="foob5r" sudo="true"/> 
    </group> 
    <group name="profiler"> 
     <server name="machine03" user="root" password="blue123"/> 
     <server name="machine03" /> 
    </group> 
</configuration> 

<configuration>屬性是必須,在至少一個<group>至少一個<server>。服務器內的 ,只有name屬性是必須的。

我想出了:

<?xml version="1.0" encoding="utf-8"?> 
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="configuration"> 
    <xsd:complexType> 
      <xsd:element name="group"> 
      <xsd:complexType> 
       <xsd:element name="server"> 
        <xsd:attribute name="name" type="xsd:string" use="required" /> 
        <xsd:anyAttribute/> 
       </xsd:element> 
      </xsd:complexType> 
      </xsd:element> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

不這樣做的伎倆,可悲。

+0

你是什麼意思'<配置>'*屬性*是必須的? ''是一個元素,它在你的實例和模式中沒有任何屬性。我相信你的意思是*元素*。 – helderdarocha

回答

2

如果你能有許多<group>子元素,那麼你就必須聲明maxOccurs="unbounded",因爲默認,當maxOccurs不存在,是1

<xsd:element minOccurs="1" maxOccurs="unbounded" name="group"> ... 

<server>相同。在您的模式中,它只聲明。如果您不止一個,則需要添加maxOccurs。 (也可以使用固定值,如maxOccurs="2"如果只有2臺服務器是允許的。)該屬性 保證至少一個<group>和至少一個<server>必須存在。

至於屬性,你需要指定他們不會被驗證。你可以做到這一點與processContents="lax"processContents="skip"當您使用xsd:anyAttribute

<xsd:anyAttribute processContents="lax"/> 

這就是全部。這些更正您的XSD如下所示,它應該驗證您的實例:

<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

    <xsd:element name="configuration"> 
     <xsd:complexType> 
      <xsd:sequence> 

       <xsd:element minOccurs="1" maxOccurs="unbounded" name="group"> 
        <xsd:complexType> 
         <xsd:sequence> 

          <xsd:element name="server" minOccurs="1" maxOccurs="unbounded"> 
           <xsd:complexType> 
            <xsd:attribute use="required" name="name" type="xsd:string" /> 
            <xsd:anyAttribute processContents="lax"/> 
           </xsd:complexType> 
          </xsd:element> 

         </xsd:sequence> 
         <xsd:attribute name="name" type="xsd:string" /> 
        </xsd:complexType> 
       </xsd:element> 

      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 

</xsd:schema> 
+0

我已經將use =「required」添加到了屬性中,現在它實現了這個功能。謝謝! – nixer

+0

謝謝。我忘了那個細節。修復。 – helderdarocha

0

我猜maxOcuurs在烏爾XSD失蹤

<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<xsd:element name="configuration"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element minOccurs="1" name="group" maxOccurs="unbounded"> 
       <xsd:complexType> 
        <xsd:sequence> 
         <xsd:element name="server" minOccurs="1" maxOccurs="unbounded"> 
          <xsd:complexType> 
           <xsd:attribute name="name" type="xsd:string" /> 
           <xsd:anyAttribute/> 
          </xsd:complexType> 
         </xsd:element> 
        </xsd:sequence> 
        <xsd:attribute name="name" type="xsd:string" /> 
       </xsd:complexType> 
      </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 
</xsd:schema>