2015-07-04 56 views
0

請告訴我是否有可能,如果可能的話。如何在xsd中聲明xml中的所有屬性都是可選的。我無法聲明所有屬性,因爲我的xml具有不同數量的屬性,包括已知屬性和未知屬性。XML驗證 - 已知和未知屬性可選?

 schema = factory.newSchema(new StreamSource(xsdFileInputStream)); 
     Validator validator = schema.newValidator(); 
     validator.validate(new StreamSource(new StringReader(xmlString))); 

謝謝。

+0

讓我看看我是否明白這一點,你不能修改XSD中的每個元素,但你想聲明一些全局標誌,這將會把所有元素變成可選項? – John

+0

是的,每個元素的所有屬性。 – JDev

+0

但您需要修改XSD,您無法使用驗證器實例執行此操作。 – John

回答

0

如果你可以修改XSD每一個元素,那麼它是如此簡單:

<xs:element name="name" type="xs:string" minOccurs="0" maxOccurs="unbounded" /> 

這是你可以聲明屬性附加傷害可選:

<xs:attribute name="lang" type="xs:string" use="optional"/> 

而且不知道如果我最終的要求是正確的,你想要做到這一點自動神奇。 沒有全局標誌,這將使這一切成爲可能,但你可以這樣創建腳本:在Java中

  • 打開XSD文件
  • 一行
  • 讀行,如果您發現<xs:sequence>,打開修改算法波紋管
  • 外表爲元素或屬性的聲明在一個給定的線
  • 如果有元件,附加到它發生規則
  • 屬性是可選的由DEF行兇,因此,如果它們包含「需要」,將其更改爲可選
  • ,當你發現</xs:sequence>,關閉修正算法
  • 重複,直到沒有行

注意:做String此操作將取代解析完成後文件的內容。

+1

我無法在根元素中聲明「minOccurs =」0「maxOccurs =」unbounded「」。不允許。 – JDev

+0

需要修改才能解析標記中的元素。 – John

+0

怎麼辦?根元素具有屬性。 – JDev

0

我找到了解決方案!

<xs:anyAttribute processContents="skip"/> 
0

XSD 1.1允許你說

<xs:schema defaultAttributes="defaultAttGroup"... 

<xs:attributeGroup name="defaultAttGroup"> 
    <xs:anyAttribute processContents="skip"/> 
</xs:attributeGroup> 

這相當於增加一個屬性通配符每一個複雜的類型。