2009-03-21 10 views
7

आप इसे सत्यापित करने के लिए किसी XML दस्तावेज़ के विरुद्ध एक XPath अभिव्यक्ति सत्यापित कर सकते हैं, लेकिन क्या उस दस्तावेज़ के लिए स्कीमा के विरुद्ध समान XPath अभिव्यक्ति को सत्यापित करने का कोई आसान तरीका है?क्या मैं एक्सएमएल स्कीमा के खिलाफ XPath अभिव्यक्ति को मान्य कर सकता हूं?

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" ... etc> 
    <xsd:element name="RootData"> 
    <xsd:complexType> 
     <xsd:sequence minOccurs="0"> 
     <xsd:element name="FirstChild"> 
      <xsd:complexType> 
      <xsd:sequence minOccurs="0"> 
       <xsd:element name="FirstGrandChild"> 
... etc etc 

एक आसान या निर्मित रास्ता सत्यापित करने के लिए XPath है:

मैं इस तरह एक XSD स्कीमा है कहो

/RootData/FirstChild/FirstGrandChild 

किसी भी एक्सएमएल दस्तावेजों के खिलाफ मान्य होगा कि उस स्कीमा पर आधारित हो सकता है? (संपादित: मुझे लगता है कि मेरा मतलब है संभावित वैध; वास्तविक XML दस्तावेज़ उन तत्वों को शामिल नहीं हो सकता है, लेकिन वह अभी भी XPath स्कीमा के लिए संभावित रूप से वैध माना जा सकता है जबकि, कहते हैं, /RootData/ClearlyInvalidChild/ThisElementDoesntExistEither स्पष्ट रूप से अवैध है।।)

बेशक मैं केवल यह उम्मीद कर सकता हूं कि यह मनमाने ढंग से जटिलता के बजाय कैननिकल XPath अभिव्यक्तियों के खिलाफ काम करे, लेकिन यह ठीक है।

मैं विशेष रूप से .NET में सोच रहा हूं लेकिन अगर अन्य कार्यान्वयन इसे संभव बनाता है तो उत्सुक हूं। यह इतना महत्वपूर्ण है कि मैं अपने खुद के रोल करना चाहते हैं नहीं है, उदाहरण के लिए मैं नहीं है वास्तव में एक दूसरे की तरह में कि XPath अभिव्यक्ति को बदलने के लिए अपने खुद के कोड लिखना चाहते हैं:

/xsd:schema/xsd:element[@name='RootData']/xsd:complexType/xsd:sequence/xsd:element[@name='FirstChild']/...etc... 

... हालांकि मैं जानता हूँ कि मैं कर सकता ऐसा करें अगर मुझे वास्तव में करना पड़ा।

चीयर्स!

+0

वह XPath उदा। उस एक्सएसडी के आधार पर * किसी भी * दस्तावेज़ के खिलाफ मान्य नहीं होगा - अगर फर्स्ट चाइल्ड (या फर्स्टग्राउंड चाइल्ड) 0 गुना होता है, तो मुझे यकीन नहीं है कि आप वास्तव में क्या कर रहे हैं। शायद आप का मतलब है कि एक XPath उस स्कीमा के आधार पर * कुछ * दस्तावेज़ के खिलाफ मान्य हो सकता है। कृपया स्पष्ट करें। – 13ren

+0

बेशक मेरा मतलब है "संभावित रूप से मान्य"। कैनोनिकल XPath का जिक्र करते हुए मैं यही कर रहा था, लेकिन यह स्पष्ट करने के लिए संपादित किया गया है कि मैं एक संभावित XML दस्तावेज़ भी मान रहा हूं। – Gavin

+0

मुझे यकीन नहीं है कि "कैननिकल XPath एक्सप्रेशन" की एक सटीक तकनीकी परिभाषा है - मेरा अनुमान था कि आप बाधाओं के बिना सरल नाम थे। बीटीडब्ल्यू: सरल नामों के लिए, यह परिवर्तन नियमित अभिव्यक्तियों के साथ सरल है (लेकिन दुर्भाग्य से नामित प्रकारों के लिए काम नहीं करेगा, क्योंकि वे नेस्टेड नहीं हैं) – 13ren

उत्तर

6

हमने वास्तव में इस पर एक शोध परियोजना की, और लगभग 2000 के आसपास एक XPath सत्यापनकर्ता लागू किया। यह XPath 1 के लिए था। मुझे वर्तमान में उपलब्ध किसी भी पुस्तकालयों के बारे में पता नहीं है जिसे आप ऐसा करने के लिए उपयोग कर सकते हैं।

  • आप एक स्कीमा पर एक पथ में एक उदाहरण दस्तावेज़ पर एक पथ को बदलने के लिए के रूप में आप ऊपर कर में सक्षम नहीं होगा:

    आप जा सकते हैं और यह अपने आप को लागू करना चाहते हैं, तो यहां कुछ संकेत दिए हैं। उदाहरण के लिए, /a//b/xsd:element[@name='a']//xsd:element[@name='b'] में परिवर्तित नहीं होता है क्योंकि तत्व बी को स्कीमा के शीर्ष स्तर पर परिभाषित किया जा सकता है, बी के नीचे नहीं।

  • याद रखें कि एक XML दस्तावेज़ एक पेड़ है, एक स्कीमा एक ग्राफ है।यदि आप // ए जैसे वंशज पथ खोजते हैं, तो आपको यह तय करना होगा कि खोज को कब समाप्त करना है या यह हमेशा के लिए जारी रह सकता है (उदाहरण के लिए एक तत्व "ए" जिसमें "बी" है, जिसमें "ए" है)

  • कुछ पथ निर्विवाद या कम से कम निर्णय लेने के लिए बहुत कठिन होंगे। उदाहरण //*[starts-with(@name, 'foo')]

आप अभी भी इसके लिए कर रहे हैं के लिए, मैं ग्रहण के XSD या .NET स्कीमा लोड हो रहा है वर्गों की तरह एक पुस्तकालय उपयोग करने का सुझाव स्मृति में स्कीमा लोड और कोड में अपने जाँच करने के लिए।

+0

आपकी शोध परियोजना काफी मूल्यवान सॉफ्टवेयर हो सकती है। –

3

डिज़ाइन समय पर, आप एक नमूना एक्सएमएल दस्तावेज उत्पन्न करने के लिए एक उपकरण का उपयोग कर सकते हैं और नमूना के खिलाफ अपने XPath निष्पादित कर सकते हैं। अल्टोवा एक्सएमएल जासूस में यह सुविधा है, जैसा कि एसओएपी यूआई करता है।

एसओएपी यूआई वास्तव में खुला स्रोत (जावा) है, तो हो सकता है कि आप एक चोटी ले सकें और देखें कि यह नमूने कैसे उत्पन्न करता है। रनटाइम स्थिति में (यानी यदि स्कीमा और XPath दोनों चल रहे प्रोग्राम में इनपुट हैं) तो आपको झूठी नकारात्मकताओं से बचने के लिए पर्याप्त वैकल्पिक घटक और नमूना डेटा उत्पन्न करना होगा और कई उदाहरण फाइलें उत्पन्न करने की आवश्यकता हो सकती है।

मैं सीधे स्कीमा के खिलाफ XPath का मूल्यांकन करने की कोशिश नहीं करता क्योंकि विभिन्न एक्सिस एक पूर्ण समाधान को बहुत जटिल बनाते हैं। मुझे पूरा यकीन है कि किया जा सकता है, लेकिन यह मुझे हार्ड कोर गणित के रूप में मारता है। मैं नमूनों को शॉर्ट-कट के रूप में उत्पन्न करने का प्रस्ताव करता हूं।

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

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