2014-12-02 63 views
1

我剛開始嘗試驗證我一直在使用的XML配置文件。每個配置都指定一個服務器的默認配置,可以基於每個服務器進行覆蓋。需要一個沒有屬性的元素XSD

這是默認:

<server> 
    <cpu>65</cpu> 
    // Other configuration 
</server> 

這是一個(可選)重寫:

<server key="2"> 
    <cpu>55</cpu> 
</server> 

我不知道如何建立XSD支持1必需的元素沒有屬性,具有屬性的0-n個元素,因爲它們具有相同的名稱。用不同的名字,這是一件容易得多的事情,但由於元素在其他方面是相同的,所以這似乎很混亂。

編輯:

爲了解決@ kjhughes的要求,這裏的簡化文檔結構:

<configuration> 
    <target>Production</target> 
    <responsible>[email protected]</responsible> 
    <server> 
    <cpu>65</cpu> 
    </server> 
    <server key="2"> 
    <cpu>55</cpu> 
    </server> 
</configuration> 

回答

1

在同一內容模型中不能有相同名稱的不同元素。

但你改變你的第二個server元素的名稱,以反映他們的服務器覆蓋

<?xml version="1.0" encoding="UTF-8"?> 
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:noNamespaceSchemaLocation="try.xsd"> 
    <target>Production</target> 
    <responsible>[email protected]</responsible> 
    <server> 
    <cpu>65</cpu> 
    </server> 
    <server-override key="2"> 
    <cpu>55</cpu> 
    </server-override> 
</configuration> 

並且仍可以通過延期分享他們的共性的類型定義:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:element name="configuration"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="target"/> 
     <xs:element name="responsible"/> 
     <xs:element name="server" type="server-type" 
       minOccurs="1" /> 
     <xs:element name="server-override" type="server-override-type" 
       minOccurs="0" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:complexType name="server-type"> 
    <xs:sequence> 
     <xs:element name="cpu"/> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="server-override-type"> 
    <xs:complexContent> 
     <xs:extension base="server-type"> 
     <xs:attribute name="key" use="required"/> 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 
</xs:schema> 
+0

我很害怕這將是瀏覽規範的情況。儘管如此,使用擴展可以使這個過程變得更加簡單。謝謝! – mgw854 2014-12-02 18:23:15

-1

嘗試JAXB解組,您可以創建可用於解組XML的Java對象,這使得它更容易處理XML 使用XSD爲generationg的JAXB對象 取決於你在Eclipse中你只需要右鍵點擊你的xmlroot並按生成JAXB什麼IDE ,,,

+0

問題是我沒有XSD(我也沒有使用Java)。 – mgw854 2014-12-02 17:01:03