2011-08-23 101 views
0

在我編寫應用程序的框架中,有許多xml文件,其中節點名稱並不重要。所有有價值的信息都放在屬性中。節點類型是通過其中一個屬性定義的。僅定義屬性的XSD架構

我想寫這個文件的簡單架構。我認爲它應該滿足兩大條件:

  • 每一個元素可以從定義的列表屬性(例如名稱,值類型[會有更多!])
  • 每一個元素可以擁有的元素序列確切的定義

如果有可能使屬性列表依賴於某些給定的(例如類型)參數,它將是非常有用的。

XSD文件可以處理這些XML文件嗎?是否有可能編寫這樣的模式?如何定義任何節點的屬性列表。

回答

0

您需要爲xml實例中要支持的每個可能的元素和屬性組合定義XSD類型。例如

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="root"> 
    <xs:complexType> 
     <xs:all> 
     <!-- declarations of any of the types you can use --> 
     <xs:element name="MyType1" type="MyType1Type" /> 
     <!-- etc.. --> 
     </xs:all> 
    </xs:complexType> 
    </xs:element> 
    <!-- Type definitions --> 
    <xs:complexType name="MyType1> 
    <xs:sequence> 
     <xs:element name="MyElement1" type="xs:string" /> 
     <xs:element name="MyElement2" type="xs:date" /> 
     <!-- etc.. --> 
    </xs:sequence> 
    <xs:attribute name="MyAttribute1" type="xs:string" /> 
    <!-- etc.. --> 
    </xs:complexType> 
    <xs:complexType name="MyType2> 
    <xs:sequence> 
     <xs:element name="MyElement3" type="xs:string" /> 
     <xs:element name="MyElement4" type="xs:date" /> 
     <!-- etc.. --> 
    </xs:sequence> 
    <xs:attribute name="MyAttribute3" type="xs:string" /> 
    <!-- etc.. --> 
    </xs:complexType> 
    <!-- etc.. --> 
</xs:schema> 

一旦你定義了所有可能的類型,那麼你可以支持任何xml文件。

希望這有助於

編輯:或者使用的xs:anyType類型。

+0

不幸,正如我所說的節點名稱不提供任何信息。開發人員可以絕對插入這裏所有的定義元素名單是不可能的。 –

+0

然後你需要使用xs:anyType類型。 –

+0

你能提供我提到的條件的例子嗎? –

0

您可以擁有一個只定義了一個complexType的模式,其中包含所有的屬性。您的挑戰是找到一個模式處理器,它的API允許您請求針對該指定類型的給定輸入元素的驗證。這樣做的一個方法是使用感知模式的XSLT處理器(以及產生大量的輸出,你可以放棄的)

<xsl:template match="*"> 
    <xsl:copy-of select="." type="my-complex-type"/> 
    <xsl:apply-templates/> 
</xsl:template> 

將驗證對您的類型聲明的文檔中的每個元素

+0

我的可能性是有限的,因爲我只擴展當前只處理xsd的現有類。太糟糕了:( –