簡體   English   中英

XSD-任何(未知)元素的未綁定數目,但定義了序列中的最后一個元素

[英]XSD - unbound number of any (unkown) elements but last element in sequence is defined

是否可以使用一個或多個XSD來驗證以下xml結構

<container>
    <unkownA />
    <unkownB />
    <unkownC />
    ...
    <data />
</container>

根據那些規則

  1. 有無限數量的未知元素
  2. 至少有這些未知的元素之一
  3. 最后一個元素是數據
  4. 數據僅發生一次
  5. 根據提供的規則驗證數據

xml中的所有元素都具有相同的名稱空間(“”) ,我們無法更改。 盡管我知道這可能是最簡單的解決方案,但我們很可能也無法更改元素的順序 通常,更改xml是不可行的選擇,因為它是由我們無法控制的外部系統生成的。

我嘗試過這樣的事情

<xs:sequence>
   <xs:any minOccurs="1" maxOccurs="unbounded" processContents="lax" />
   <xs:element ref="data" minOccurs="1" />
</xs:sequence>

當然,哪個模棱兩可違反了“唯一粒子歸因”。

在這里,我還了解了使用第二個命名空間的知識。 創建一個“靈活的” XML模式,但是由於我們無法更改xml,因此這似乎不是解決方案,或者我顯然不正確地理解它。

通過使用Java處理xml / xsd,xsd 駐留在類路徑中 ,因此從xsd內部導入xs:import可能是一個問題。

如果答案是“在這些限制內使用xsd無法完成”,那么我很好。

有什么想法嗎?

您嘗試的模式在XSD 1.1中有效-使用最新版本的Saxon或Xerces,再試一次。

如果至少知道您希望在容器類型中使用的類型的名稱,則可以將其命名為xs:anyType類型。 但是您需要知道可能的類型名稱的列表,否則定義它們的模式的意義是什么?

更新:我不正確,您可以將容器設置為<xs:any/>但這將阻止您指定容器中必須有一個<data />元素。

終於奏效了,即使這並不令我高興:

javax.xml.validation.SchemaFactory schemaFactory = SchemaFactory
        .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);

schemaFactory
    .setFeature(
        "http://apache.org/xml/features/validation/schema-full-checking",
        false);

這似乎禁用了架構本身的驗證。 xml的驗證按預期並如上所述進行。 是的,我知道:禁用默認情況下處於活動狀態的安全/完整性功能可能不是一個好主意。 但是直到知道沒有時間找到更好的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM