2014-09-23 5 views
7

मुझे एक्सएमएल स्कीमा का एक उदाहरण चाहिए जो कुछ और सबकुछ की अनुमति देगा।एक्सएमएल स्कीमा जो कुछ भी (xsd: any)

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

मैंने अपनी वर्तमान स्कीमा लेने की कोशिश की, और केवल एक्सएस: स्कीमा टैग को खाली स्कीमा बनाने के लिए रखा, लेकिन यह स्पष्ट रूप से काम नहीं किया।

उत्तर

6

एक्सएमएल स्कीमा यह निर्दिष्ट नहीं कर सकता कि दस्तावेज़ इसकी सामग्री के बावजूद मान्य है।

हालांकि, अगर आप मूल तत्व निर्दिष्ट करने के लिए कर रहे हैं, तो आप xs:anyAttribute और xs:any उपयोग कर सकते हैं अनुमति देने के लिए मूल तत्व और रूट के तहत किसी भी एक्सएमएल पर कोई गुण:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded"/> 
     </xs:sequence> 
     <xs:anyAttribute processContents="skip"/> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

आपके मामले में, जब तक आप संभावित रूट तत्व नामों की सीमित संख्या का आश्वासन दे सकते हैं, तो आप किसी भी XML सामग्री को किसी ज्ञात नाम के साथ रूट तत्व के तहत अनुमति देने के लिए इस तकनीक का उपयोग कर सकते हैं।


अद्यतन: यह बहुत अधिक संक्षेप में लिखा जा सकता है [सौजन्य: C. M. Sperberg-McQueen]:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="root"/> 
</xs:schema> 

ध्यान दें कि यह अनुमति दे रहा है, but not requiring, root to be empty.

+1

यह काम करता है और यह पूरी तरह से मेरी स्थिति के साथ फिट बैठता है। धन्यवाद। – Shadowxvii

+3

'रूट' को ' के साथ घोषित करना सामान्य परिस्थितियों में समान प्रभाव होगा, और कम होगा। –

+0

उत्कृष्ट। उत्तर अपडेट किया गया। धन्यवाद, सी एम। सेपरबर्ग-मैक्यूएन! – kjhughes

2

यह अक्सर है माना जाता है कि एक एक्सएमएल स्कीमा विभाजन दस्तावेज वें में ओएस जो वैध हैं और जो नहीं हैं। यह वास्तव में उससे अधिक सूक्ष्म है। जब आप सत्यापन का आह्वान करते हैं, तो आपको यह कहना होगा कि आप सत्यापन कैसे करना चाहते हैं। सबसे आम आमंत्रण सख्त सत्यापन है, इस मामले में या तो आपके उदाहरण दस्तावेज़ में रूट तत्व का नाम आपकी स्कीमा में वैश्विक तत्व घोषणा के नाम से मेल खाना चाहिए, या इसमें एक xsi होना चाहिए: प्रकार की विशेषता जो वैश्विक प्रकार से मेल खाती है आपकी स्कीमा में परिभाषा। यह इस प्रकार है कि कोई सीमित स्कीमा सख्त सत्यापन के तहत प्रत्येक दस्तावेज़ उदाहरण से मेल नहीं खाती है।

सिद्धांत रूप में आप ढीले सत्यापन करने के लिए एक स्कीमा प्रोसेसर भी आ सकते हैं। इस मामले में, यदि स्कीमा में वैश्विक तत्व घोषणाओं के बीच मूल तत्व नाम के लिए कोई मिलान नहीं है, तो सत्यापन सफल होता है। तो खाली स्कीमा (कोई घोषणा नहीं) प्रत्येक उदाहरण दस्तावेज़ को लक्स सत्यापन के तहत मेल खाता है।

आप नामित प्रकार के खिलाफ सत्यापन भी बुला सकते हैं। यदि आप नामित प्रकार xs: anyType के खिलाफ सत्यापन का आह्वान करते हैं, तो प्रत्येक इंस्टेंस मान्य है, भले ही स्कीमा कहता है।

चेतावनी: मैंने यहां नियमों को काफी सरल बना दिया है।

+0

यह सब करने के बाद, आपके उपयोग के मामले का व्यावहारिक उत्तर यह है: यदि आप अपने एक्सएमएल को वैध मानते हैं कि इसमें क्या शामिल है, तो सत्यापन चरण छोड़ दें। –

+1

लेकिन बात यह है कि मेरे पास कोई नियंत्रण नहीं है कि XML और scema का उपयोग कैसे किया जाता है। मैं बस एक बाहरी डीएलएल के एक समारोह भाग में एक वस्तु और एक स्कीमा पास कर सकते हैं। – Shadowxvii

+0

तो शायद सबसे अच्छा समाधान दस्तावेज़ को पढ़ने, रूट तत्व नाम की खोज करना और एक स्कीमा उत्पन्न करना है जो इस रूट तत्व नाम को टाइप = "xs: anyType" के साथ घोषित करता है। –

0

आपको स्कीमा की आवश्यकता नहीं है या नहीं चाहिए। XML documents can be classified as "well-formed" and "valid"

ऊपर जवाब राज्यों के रूप में:

एक्सएमएल कि XML मानक के अनुरूप ठीक है, का गठन माना गया है जबकि एक्सएमएल कि एक DTD [या स्कीमा] का पालन करता है वैध माना जाता है।

मुझे यह इंगित करना चाहिए कि सभी वैध XML दस्तावेज़ भी अच्छी तरह से गठित हैं। लेकिन आपके मामले में, आपको XML दस्तावेज़ की 'वैधता' की परवाह नहीं है, बस यह अच्छी तरह से गठित है। सभी एक्सएमएल पार्सर्स (वास्तव में) अच्छी तरह से गठबंधन की जांच कर सकते हैं, और स्कीमा सत्यापन करने के लिए आमतौर पर अतिरिक्त चरणों की आवश्यकता होती है।

बाद में (सत्यापन) को मजबूर किए बिना आप पूर्व (अच्छी तरह से गठबंधन की जांच) कैसे कर सकते हैं।

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