2012-08-02 12 views
5

मैं एक एपीआई के परीक्षण को स्वचालित करने के लिए काम कर रहा हूं जो एक्सएमएल लेता है और लौटाता है, इसलिए मैं जितना संभव हो सके स्कीमा में एपीआई के दस्तावेज रिटर्न डेटा का अनुवाद करना चाहता हूं। मैंने उपयोग और सीखने में आसानी के आधार पर इस कार्य के लिए RelaxNG चुना है।क्या एक ही नाम वाले तत्वों के एक अनियमित सेट को निर्दिष्ट कर सकते हैं, लेकिन अलग-अलग विशेषताएं?

इससे पहले कि मैं सभी जानकारी में फेंक, यहाँ सवाल है:

यह वर्णन करने के लिए "तत्वों की अव्यवस्थित सेट, एक ही नाम है, लेकिन अलग-अलग विशेषताओं के साथ" संभव है?

<item> 
    <id>d395136e-d060-4a6e-887c-c0337dd7ad09</id> 
    <name>The item has a name</name> 
    <link rel="self" type="type1" href="url" /> 
    <link rel="download" type="type2" href="url" /> 
    <link rel="relatedData" type="type3" href="url" /> 
</item> 

लिंक वस्तुओं बिट है कि मैं काट दिया हो रही हैं:

यहाँ मैं मुसीबत का वर्णन हो रही है के लिए एक नमूना वस्तु है। यहां समस्या है:

  • आइटम के अंदर तत्वों के क्रम की गारंटी नहीं है, इसलिए मैं सभी तत्वों को <interleave> संरचना में रखने की कोशिश कर रहा हूं।
  • <item> के अंदर <item> के अंदर कई <item> के अंदर तत्व होंगे (यानी <item> में 'स्वयं' लिंक, एक 'डाउनलोड' लिंक होना चाहिए, और एक 'संबंधित डेटा' लिंक मान्य होना चाहिए)।
  • प्रत्येक लिंक प्रकार में से एक की आवश्यकता है, लेकिन फिर आदेश की गारंटी नहीं है।

    <element name="item"> 
        <interleave> 
         <element name="id"><text/></element> 
         <element name="name"><text/></element> 
         <ref name="selfLink"/> 
         <ref name="launchLink"/> 
         <ref name="thumbnailLink"/> 
        </interleave> 
    </element> 
    

    'क्लिक' संदर्भ इसलिए की तरह कहीं और परिभाषित कर रहे हैं: - जिंग से

    <define name="selfLink"> 
    <element name="link"> 
        <attribute name="href"><text/></attribute> 
        <attribute name="rel"><value>self</value></attribute> 
        <attribute name="type"><value>type1</value></attribute> 
    </element> 
    </define> 
    

    पार्सर इस बारे में खुश नहीं है

मैं तो जैसे स्कीमा का वर्णन करने की कोशिश की मुझे error: the element "link" can occur in more than one operand of "interleave" मिल गया है। मैं देख सकता हूं कि यह क्या हो रहा है लेकिन मुझे आशा है कि यह अद्वितीय वस्तुओं के रूप में 'समान नाम वाले तत्वों लेकिन अलग-अलग विशेषताओं' के विचार को संभाल सके।

इंटरलीव से लिंक रिफ्रेंस को स्थानांतरित करना इसे पार्स करने के लिए मिलता है, लेकिन जब भी लौटाए गए डेटा में ऑर्डर बदलता है तो मैं सत्यापनकर्ता को उड़ने का इंतजार करूँगा।

कोई विचार, या यह असंभव है? क्या एक्सएमएल के साथ कोई अंतर्निहित मुद्दा है जो मैं प्रसंस्करण कर रहा हूं जिसके लिए मुझे अपने परीक्षण अनुप्रयोग में उच्च प्रसंस्करण तर्क में कुछ स्थानांतरित करने की आवश्यकता होगी (अधिक सामान्य XML सत्यापन चलाने के बाद मैन्युअल रूप से प्रत्येक लिंक प्रकार की जांच करें?)

+0

जब आप कहते हैं कि "अलग-अलग विशेषताओं", आप वास्तव में क्या मतलब है "अलग विशेषता मान":

यहाँ एक टुकड़ा है कि स्कीमेट्रोन कि है supported by Jing के संस्करण का उपयोग कर अपने <link> तत्वों की जांच करता है? – mzjn

+0

दरअसल, हां, स्पष्टीकरण के लिए धन्यवाद। विभिन्न मूल्य आवश्यकताओं के साथ विशेषताओं का एक ही सेट। – James

उत्तर

3

ऐसा लगता है कि आप एनजी रिलेक्स में एक restriction on interleave पर ठोकर खाई है देखें। मैं Schematron में ऐसा करने की कोशिश करता हूं, या शायद RELAX एनजी और Schematron का संयोजन।

<schema xmlns="http://www.ascc.net/xml/schematron"> 
    <pattern name="link pattern"> 
    <rule context="item"> 
     <assert test='count(link) = 3'>There must be 3 link elements.</assert> 
     <assert test="count(link[@rel = 'self' and @type ='type1']) = 1">There must be 1 link element wwhere @rel='self' and @type='type1'.</assert> 
     <assert test="count(link[@rel = 'download' and @type ='type2']) = 1">There must be 1 link element where @rel='download' and @type='type2'.</assert> 
     <assert test="count(link[@rel = 'relatedData' and @type = 'type3']) = 1">There must be 1 link element where @rel='relatedData' and @type='type3'.</assert> 
    </rule> 
    </pattern> 
</schema> 
+1

यह विचार प्राप्त करता है, और मैं इसे इस उदाहरण के लिए कार्यान्वित करने में सक्षम था और पुष्टि करता हूं कि यह काम करता है। RelaxNG में schematron एम्बेड करने में बस मेरे पैर की अंगुली डुबकी डालने के बाद, मुझे लगता है कि जब तक मुझे रोडब्लॉक नहीं मिल जाता तब तक यह अब तक जाने का तरीका हो सकता है। मुझे अधिक जटिल सेटअप/प्रसंस्करण पाइपलाइन स्थापित करने की आवश्यकता के खर्च पर एक्सएमएल सत्यापन को एक स्थान (वैधता और एप्लिकेशन तर्क के बीच विभाजित नहीं) रखने की क्षमता प्राप्त होती है। एक उचित व्यापारिक लगता है। – James

1

यदि निम्न स्कीमा में मदद करता है

<grammar xmlns="http://relaxng.org/ns/structure/1.0"> 
<start> 
    <element name="item"> 
     <interleave> 
      <element name="id"><text/> 
      </element> 
      <element name="name"><text/></element> 
      <oneOrMore> 
       <ref name="link"/> 
      </oneOrMore> 
     </interleave> 
    </element> 
</start> 

<define name="link"> 
    <element name="link"> 
     <attribute name="href"/> 
     <choice> 
      <group> 
       <attribute name="rel"><value>self</value></attribute> 
       <attribute name="type"><value>type1</value></attribute> 
      </group> 
      <group> 
       <attribute name="rel"><value>download</value></attribute> 
       <attribute name="type"><value>type2</value></attribute> 
      </group> 
      <group> 
       <attribute name="rel"><value>relatedData</value></attribute> 
       <attribute name="type"><value>type3</value></attribute> 
      </group> 
     </choice> 
    </element> 
</define> 
</grammar> 
+0

हालांकि यह मुझे मेरे डेटा की गारंटी-वैध जांच के लिए नहीं लेता है, लेकिन यह विचार मुझे करीब ले जाता है - एक्स 'लिंक के साथ मेरे इंटरलीव में' 'डालकर, मैं' एक्स लिंक ऑब्जेक्ट्स 'से मिलान कर सकता हूं जिसे कहीं भी समूहीकृत किया जा सकता है आइटम में 'और' लिंक 'की स्कीमा में अपने' पसंद 'विचार का उपयोग करके, मैं मान्य कर सकता हूं कि सभी' लिंक 'वैध लिंक तत्वों के सेट से हैं। उच्च स्तरीय एप कोड को अभी भी यह जांचना होगा कि प्राप्त 3 लिंक वास्तविक तीन हैं जो लौटे ऑब्जेक्ट में अपेक्षित हैं ('एक डाउनलोड लिंक, एक स्वयं लिंक, और' आइटम' 'में एक संबंधित डेटा लिंक)। धन्यवाद। – James

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

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