2009-11-02 46 views
4

好吧,我的任務是從供應商給我們的XML文檔寫入XSD。該供應商沒有可供應的XSD,因此我正在對其進行逆向工程。以下是形成這種XML方式的一例:奇怪的XML模式

<field name="id">1</field> 
<field name="Sport">Football</field> 
<field name="Position">Quarterback</field> 
<field name="Touchdowns">7</field> 
<field name="Interceptions">2</field> 
<field name="Yardage">2000</field> 

所以,既然所有的元素被命名爲「田」字,我無法創建此模式。這是我到目前爲止:

<xs:element name="field" type="xs:int"> 
    <xs:simpletype> 
     <xs:attribute name="name" type="xs:string" default="id"/> 
    </xs:string> 
</xs:element> 

我遇到的問題是,所有的元素將具有相同的名稱。我用來編寫xsd的軟件遇到了問題。我在這裏有正確的方法嗎?

感謝您的任何幫助。

+0

不應該是字段元素是typ e字符串? – csl 2009-11-02 16:16:19

+0

不,因爲第一個元素的實際內容是id,它是一個int。 – user201051 2009-11-02 16:25:07

+0

Sry - 應該更具描述性 - 示例xsd只包含第一個元素(id字段) – user201051 2009-11-02 16:25:51

回答

2

您基本上有一種類型,它是您以不同方式擴展的基本元素。請原諒,如果代碼是關閉的,我沒有嘗試驗證架構,並且我正在從內存中寫入它,而不是編寫架構的好方法,但您應該明白。

<xsd:complexType name="field"> 
    <xsd:simpleContent> 
     <xsd:extension> 
      <xsd:attribute name="name" /> 
     </xsd:extension> 
    </xsd:simpleContent> 
</xsd:complexType> 

定義具有屬性名稱(對屬性類型沒有限制)的基本元素。這將驗證原始帖子中的所有示例。

,那麼你可以嘗試擴展是:

<xsd:complexType name="idField"> 
    <xsd:complexContent> 
     <xsd:extension base="field"> 
      ...restrict it in here 
     </xsd:extension> 
    <xsd:complexContent> 
</xsd:complexType> 

而且做這樣的事情,對於每一個變化,從根本上讓他們的子類型主要定義的。

我意識到這個「答案」並不真正給出明確的答案,但希望它會把你推向正確的方向。

如果不這樣做,除了讓供應商重寫他們的XML之外,我沒有看到你能做什麼。

+0

實際上,剛剛意識到可能有一種方法,在我編輯時掛起,該死的我的快速打字和慢思考... – chrisbunney 2009-11-02 16:16:28

+0

是啊,所以編輯提出了一種擴展基本字段類型以匹配不同專業化的方法,但我並不完全確定它是多麼準確/有效。 – chrisbunney 2009-11-02 16:31:25

5

field元素的maxOccurs的默認值爲1(因此嘗試將其設置爲無界),simpleType也可能不包含屬性或子元素。

我相信下面的示例工作:

XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="fields"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element maxOccurs="unbounded" ref="field"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="field"> 
    <xs:complexType> 
     <xs:attribute name="name" type="xs:string" use="required"/> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

XML:

<?xml version="1.0" ?> 
<fields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="fields.xsd"> 
    <field name="id">1</field> 
    <field name="Sport">Football</field> 
    <field name="Position">Quarterback</field> 
    <field name="Touchdowns">7</field> 
    <field name="Interceptions">2</field> 
    <field name="Yardage">2000</field> 
</fields> 

我用的xs:字符串中的name類型,但我想你可以定義一個新的數據類型只能強制執行某些關鍵字...

+0

看起來很好且有效。我認爲儘管有這樣的通用模式是有效的,但它並沒有真正增加實例XML文件的正式定義。但是,它可能是創建有效模式的最簡單方法(+1) – chrisbunney 2009-11-03 12:48:06