2011-03-03 19 views
6

我需要指定一個用於驗證XML文檔的XSD。 XSD將用於JAXB生成的Java綁定。 我的問題是指定可選元素,我不知道名稱和我通常不感興趣解析。創建使用<all>和<any>元素打開的有效XSD

XML文檔的結構是這樣的:

<TRADE> 
    <TIME>12:12</TIME> 
    <MJELLO>12345</MJELLO> 
    <OPTIONAL>12:12</OPTIONAL> 
    <DATE>25-10-2011</DATE> 
    <HELLO>hello should be ignored</HELLO> 
</TRADE> 

重要的是,認爲:

  • 我不能假設任何順序,接下來的XML文檔實例migtht有吊牌以不同的順序
  • 我只想解析一些標籤,有些是必需的,有些是可選的
  • XML文檔NTS可以與我沒有興趣在解析

新的元素來擴展我的XSD的結構是這樣(不是有效的XSD):

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

    <!-- *********************************************** --> 
    <!-- Trade element definitions for the XML Documents --> 
    <!-- *********************************************** --> 

    <xs:complexType name="Trade"> 
    <!-- Using the all construction ensures that the order does not matter --> 
    <xs:all> 
     <xs:element name="DATE" type="xs:string" minOccurs="1" maxOccurs="1" /> 
     <xs:element name="TIME" type="xs:string" minOccurs="1" maxOccurs="1" /> 
     <xs:element name="OPTIONAL" type="xs:string" minOccurs="0" maxOccurs="1" /> 
     <xs:any minOccurs="0"/> 
    </xs:all> 
    </xs:complexType> 

    <!-- TRADE is the mandatory top-level tag --> 
    <xs:element name="TRADE" type="Trade"/> 

</xs:schema> 

所以,在這個例子中:DATE和TIME是強制性的(它們必須在XML中只有一次),OPTIONAL可能會出現一次,然後我想指定所有其他標記都是允許的。訂單無關緊要。

如何爲此指定有效的XSD?

回答

5

這是一個經典的解析器問題。

基本上,你的BNF是:

Trade = whatever whatever* 
whatever = "DATE" | "TIME" | anything 
anything = a-z a-z* 

但這是ambigous。字符串「DATE」既可以在任何規則下被接受爲「DATE」,也可以被接受。

所以,如果你有

<TRADE> 
    <TIME>12:12</TIME> 
    <DATE>25-10-2011</DATE> 
    <DATE>25-12-2011</DATE> 
</TRADE> 

目前還不清楚這是否應該被接受與否。

這可以解釋任何的

"TIME", "DATE", anything 
anything, anything, "DATE" 
anything, anything, anything 
"TIME", "DATE", anything 
"TIME", "DATE", "DATE" 
etc. 

這一切都歸結爲一個:如果你有一個通配符與隨機序列組合,你不能有意義地決定哪些憑證相符哪個規則。

將可選元素與wilcard一起使用尤其沒有意義。

你有兩個選擇:

  • 使用的xs:序列代替XS:所有
  • 不使用通配符

據我瞭解,這兩個選項都符合你的願望衝突。

也許你可以構建符合一切除了 DATE通配符,時間等

+0

我有一個suspecion,這是:-( 的情況下,額外的事情,我沒有寫,我好知道元素將出現最大一次 – 2011-03-03 12:44:18

+0

我最終在解析步驟之前完成了一個XSLT步驟,這完美地工作,先對我不感興趣的所有標籤進行過濾,然後根據僅包含我感興趣的元素的「slim」xsd進行驗證 – 2011-03-04 09:37:06

+0

如果我知道'無論'永遠不會是'日期'或'時間'嗎?那麼就不會有任何歧義 – 2017-09-15 16:01:42

2

它是一個硬性要求有JAXB綁定到你的「已知」的元素? 如果沒有,您基本上可以只有<any maxoccurs="unbounded" processContents="skip"/>作爲您的xsd,然後從DOM樹中挑選出您感興趣的元素。

(見here如何使用JAXB沒有數據綁定。)

+0

我想要數據綁定(或至少是合理的XSD),因爲我解開使用XSD驗證以檢查值,長度s和數據類型。 – 2011-03-04 07:40:19

相關問題