2009-08-19 66 views
1

我認爲,解決我的問題是很容易的,但我不能FINT它 所以,這裏是:XML模式:不同的元素名稱(序列)

我有一個XML具有元素的列表用不同的名字,但是按順序。 一個例子:

<DOC> 
<DOC_OBL_1> 
    <TIP_DOC_OBL>1</TIP_DOC_OBL> 
</DOC_OBL_1> 
<DOC_OBL_2> 
    <TIP_DOC_OBL>2</TIP_DOC_OBL> 
</DOC_OBL_2> 
<DOC_OBL_3> 
    <TIP_DOC_OBL>3</TIP_DOC_OBL> 
</DOC_OBL_3> 
</DOC> 

所以,我有3個要素:DOC_OBL_1,DOC_OBL_2和DOC_OBL_3。是的,可能有數字4,5,6等 正如你可以,所有3都有相同的元素(實際上,他們有很多,但現在並不重要),我想我可以聲明一個可以驗證這種文檔的通用類型。

我怎樣才能驗證這與架構?

我知道它是一個非常醜陋的XML(也許它不是標準的,請告訴我,我不知道),但這不是我關心的構建這個文檔。我只需要解析它,驗證它並轉換它。

回答

2

嗯,當然可以!其實很簡單:如果結構是相同的每個元素,你可以定義一個<xs:complexType>來驗證,然後用:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="DOC" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="DOC"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="DOC_OBL_1" type="DocType" /> 
     <xs:element name="DOC_OBL_2" type="DocType" /> 
     <xs:element name="DOC_OBL_3" type="DocType" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:complexType name="DocType"> 
    <xs:sequence> 
     <xs:element name="TIP_DOC_OBL" type="xs:string" minOccurs="0" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

這是否對你的工作?它能處理您的所有需求嗎?

由於Zach指出相當正確 - 這個「解決方案」顯然是相當有限的,因爲它不能處理任意數量的標籤DOC_OBL_1,DOC_OBL_2,....,DOC_OBL_x - 名稱和數量標籤必須提前知道。

這是不幸的,但它是唯一的解決方案,因爲這個殘缺的XML。該REAL的解決辦法是有這樣的事情:

<DOC> 
    <DOC_OBL id="1"> 
    </DOC_OBL> 
    <DOC_OBL id="2"> 
    </DOC_OBL> 
    ..... 
    <DOC_OBL id="x"> 
    </DOC_OBL> 
</DOC> 

,然後將XML架構將變得更加容易,並可以處理任何數量的<DOC_OBL>標籤。

但是,GIGO原則適用於:垃圾進入,垃​​圾進入==>蹩腳的XML結構進來,只有蹩腳的,不完整的驗證是可能的。

馬克

+1

@marc_s如果可能有任何數量的DOC \ _OBL \ _1,DOC \ _OBL \ _2,DOC \ _OBL \ _N個節點,有沒有一種方法可以根據模式進行驗證,對元素名稱做某種正則表達式? – 2009-08-19 12:49:27

+0

不,不幸的是,這是不可能的,恐怕。您只能將實際標記名稱作爲元素名稱,否則您必須在該標記的屬性中包含固定標記名稱和可變部分(連續編號)。 – 2009-08-19 13:27:14

+0

謝謝。我想我至少要有50個元素(DOC_OBL_1 ... DOC_OBL_50)。 醜陋的輸入 - >醜陋的解決方案..:D 但它仍然可以工作,無論如何。 – eLZahR 2009-08-21 10:03:33

2

在其中它不幸的是,XML元素名稱已經基本序列號/標識符。我會說這是定義不好(非標準)的XML。

在我有限的(!)經驗中,這意味着xsd模式必須具有序列中定義的所有可能的「DOC_OBL_N」元素。如果他們的人數沒有理論上限,這可能是不實際的。

只要它有效的xml,你可以加載它並計算元素DOC的所有子元素,然後立即寫出模式,但這聽起來像是它的自我挫敗。

這可能會讓您手動驗證xml實例,使用一些xpaths - 這是一種蠻力方法,而不是技術上針對xsd模式進行驗證。

+0

輸入是一個巨大的文檔,因此比簡單的Schmea更多的代碼是不可行的。 – eLZahR 2009-08-21 10:06:45

相關問題