2011-03-03 18 views
6

XML belgelerini doğrulamak için bir XSD belirtmem gerekiyor. XSD, bir JAXB nesli Java bağlamaları için kullanılacaktır. Sorunum, adlarını bilmediğim ve genelde ayrıştırma yapmak istemediğim isteğe bağlı öğeleri belirtmektir.<all> ve <any> öğelerini kullanarak açık olan geçerli bir XSD oluşturma

XML belgelerinin yapısı gibidir:

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

önemli şey, o: Ben herhangi bir sipariş kabul edemeyiz ve sonraki XML belgesi örneği etiketine sahip migtht

  • Farklı bir sırada
  • Yalnızca bazı etiketlerin ayrıştırılmasıyla ilgileniyorum, bazıları zorunludur ve bazıları isteğe bağlıdır
  • XML docume nts Ben

ayrıştırma ilgilenmiyorum yeni unsurlarla uzatılabilir benim XSD yapısı gibi (geçerli bir xsd) 'dir:

<?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> 

Yani, bu örnekte : DATE ve TIME zorunludur (XML'de tam olarak bir kez olmalılar), OPTIONAL bir kez mevcut olabilir ve daha sonra tüm diğer etiketlere izin verildiğini belirtmek isterim. Emir önemli değil.

Bunun için geçerli bir XSD'yi nasıl belirlerim?

cevap

5

Bu klasik bir ayrıştırıcı sorunudur.

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

Ama bu olacağına dair belirsizliklerin olası geçerli:

Temelde, sizin BNF olduğunu. "DATE" dizgisi, "DATE" olarak hangi kuralın altında ve her şeyde kabul edilebilir.

Yani

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

varsa kabul edilip edilmeyeceği belirsizliğini koruyor.

Ya tek Hepsi aşağı kaynar

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

ait yorumlanabilecek: Eğer rastgele dizisi ile kombine bir joker varsa, anlamlı hangi kuralın maçları belirteç hangi karar veremez. Özellikle bir wilcard ile birlikte opsiyonel elemanlara sahip olmak anlamsızdır.

  • kullanım xs: yerine xs dizisi:

    İki seçeneğiniz vardır Anladığım kadarıyla, her iki seçeneğin isteklerinize çelişen bütün

  • kullanmayan joker

vardır .

Belki TARİH dışında her şeyi eşleşen bir joker, ZAMAN inşa vb

+0

Ben elemanlar max defa görünür biliyorum yani, –

+0

Ayrıştırma adımından önce bir XSLT adımı olan sona erdi.Bu, önce ilgimi çekmediğim tüm etiketleri filtreleyerek ve sonra yalnızca ilgilendiğim öğeleri içeren bir "ince" xsd'ye göre doğrulayarak doğrular. –

+0

eğer 'asla' bir tarih 'veya' zaman 'olmayacaksa, o zaman herhangi bir belirsizlik olmayacaksa –

2

sizin "bilinen" elemanlarına JAXB bağları var zor bir gereklilik midir? Değilse, temel olarak xsd'niz olarak yalnızca <any maxoccurs="unbounded" processContents="skip"/> ürününe sahip olabilirsiniz ve daha sonra ilgilendiğiniz öğeleri DOM ağacından seçebilirsiniz.

(veri bağlama olmadan JAXB nasıl kullanılacağını here bakın.) Bu ekstra şey yazmadım :-(böyleydi bir suspecion vardı

+0

XSD'yi kullanarak unshashall yaptığım için veri tabanına (veya en azından makul bir sıkı XSD) sahip olmak isterim. Değerleri kontrol etmek için doğrulama, uzunluk s ve veri türleri. –

İlgili konular