2011-03-03 16 views
6

का उपयोग कर एक वैध एक्सएसडी बनाना खुला है, मुझे XML दस्तावेज़ों को सत्यापित करने के लिए एक एक्सएसडी निर्दिष्ट करने की आवश्यकता है। एक्सएसडी का प्रयोग जावा बाइंडिंग की जेएक्सबी पीढ़ी के लिए किया जाएगा। मेरी समस्या वैकल्पिक तत्वों को निर्दिष्ट कर रही है जिन्हें मैं नाम नहीं जानता और जिन्हें मैं आम तौर पर पार्सिंग में रूचि नहीं रखता हूं।<all> और <any> तत्व

एक्सएमएल दस्तावेजों की संरचना की तरह है:

<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 टैग नहीं है एक अलग क्रम में
  • मुझे केवल कुछ टैगों को पार्स करने में दिलचस्पी है, कुछ अनिवार्य हैं और कुछ वैकल्पिक हैं
  • एक्सएमएल डॉक्यूमे एनटीएस नए तत्व जो मैं पार्स करने

में दिलचस्पी नहीं है के साथ बढ़ाया जा सकता है मेरी 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 अनिवार्य हैं (वे एक बार एक्सएमएल में एक बार होना चाहिए), वैकल्पिक एक बार उपस्थित हो सकता है और फिर मैं निर्दिष्ट करना चाहता हूं कि अन्य सभी टैग की अनुमति है। आदेश कोई फर्क नहीं पड़ता।

मैं इसके लिए एक वैध एक्सएसडी कैसे निर्दिष्ट करूं?

उत्तर

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. 

यह सब करने पर निर्भर करता में से एक: आप एक वाइल्डकार्ड यादृच्छिक अनुक्रम के साथ संयुक्त है, तो आप सार्थक तय नहीं कर सकता जो मैचों जो नियम टोकन।

यह विशेष रूप से विल्डकार्ड के साथ वैकल्पिक तत्वों को समझने के लिए समझ में नहीं आता है।

  • उपयोग XS: XS के बजाय अनुक्रम:

    आपके पास दो विकल्प वाइल्डकार्ड

सभी

  • का उपयोग नहीं करते मैं यह समझ के रूप में, दोनों विकल्पों अपनी इच्छा के साथ संघर्ष में हैं ।

    शायद आप एक वाइल्डकार्ड सब कुछ से मेल खाता है DATE को छोड़कर, समय का निर्माण कर सकते आदि

  • +0

    मैं एक suspecion है कि इस मामले :-(अतिरिक्त बात मैं नहीं लिखा था था मुझे पता है कि है कि तत्वों अधिकतम एक बार दिखाई देगा, –

    +0

    मैंने पार्सिंग चरण से पहले एक एक्सएसएलटी कदम उठाया। यह पूरी तरह से काम करता है, पहले उन सभी टैग को फ़िल्टर करना जिनमें मुझे रूचि नहीं है, और उसके बाद केवल "स्लिम" xsd के अनुसार मान्य करना शामिल है जिसमें मुझे रूचि है। –

    +0

    क्या अगर मुझे पता है कि 'जो कुछ भी' तारीख 'या' समय 'नहीं होगा? तो कोई अस्पष्टता नहीं होगी। –

    2

    यह एक कठिन आवश्यकता अपने "ज्ञात" तत्वों को JAXB बाइंडिंग के लिए है? यदि नहीं, तो आप मूल रूप से <any maxoccurs="unbounded" processContents="skip"/> अपने xsd के रूप में कर सकते हैं, और फिर उन तत्वों को चुनें जिन्हें आप रुचि रखते हैं DOM पेड़ से।

    (here देखें डेटा बाइंडिंग के बिना JAXB का उपयोग कैसे करें।)

    +0

    मैं डाटाबेसिंग (या कम से कम एक उचित तंग एक्सएसडी) रखना चाहता हूं, क्योंकि मैं एक्सएसडी का उपयोग करके अनमशॉल करना चाहता हूं मूल्यों, लंबाई की जांच करने के लिए सत्यापन एस और डेटाटाइप। –

    संबंधित मुद्दे