2010-03-08 9 views
6

एक और XSD क्षमता को चुनौती,

मैं अपने ग्राहकों, जो 0 होने दिया जाएगा या एक से अधिक अपरिभाषित या [कॉल] अप्रत्याशित टैग द्वारा एक्सएमएल फाइल भेज रही हैं (पदानुक्रम में प्रकट हो सकता)। वैसे वे मेरे लिए अनावश्यक टैग हैं .. इसलिए मुझे उनकी उपस्थिति को अनदेखा करना होगा, लेकिन उनके साथ टैग के कुछ सेट हैं जिन्हें सत्यापित करने की आवश्यकता है।अज्ञात टैग के सत्यापन को अनदेखा कैसे करें?

<root> 
    <undefined_1>one</undefined_1> 
    <undefined_2>two</undefined_2> 
    <node>to_be_validated</node> 
    <undefined_3>two</undefined_3> 
    <undefined_4>two</undefined_4> 
</root> 

और XSD मैं के साथ की कोशिश की:

<xs:element name="root" type="root"></xs:element> 
    <xs:complexType name="root"> 
    <xs:sequence> 
     <xs:any maxOccurs="2" minOccurs="0"/> 
     <xs:element name="node" type="xs:string"/> 
     <xs:any maxOccurs="2" minOccurs="0"/> 
    </xs:sequence> 
    </xs:complexType 

XSD कुछ कारणों की वजह से इस की अनुमति नहीं है,

यह एक नमूना एक्सएमएल है।
उपर्युक्त उदाहरण सिर्फ एक नमूना है। व्यावहारिक एक्सएमएल एक्सएमएल टैग की जटिल पदानुक्रम के साथ आता है ..

कृपया मुझे पता है कि तुम इसके बारे में एक हैक प्राप्त कर सकते हैं करते हैं।

वैसे, वैकल्पिक समाधान सत्यापन प्रक्रिया से पहले, XSL-परिवर्तन डालने के लिए है। खैर, मैं इसे टाल रहा हूं क्योंकि मुझे .NET कोड को बदलने की आवश्यकता है जो सत्यापन प्रक्रिया को ट्रिगर करता है, जो कम से कम मेरी कंपनी द्वारा समर्थित है।

+0

क्या समस्या यह है कि यह स्कीमा के खिलाफ मान्य नहीं है? –

+0

yup .. बल्कि मैं यह दिखाना चाहता था कि "मुझे नहीं पता कि यह कैसे करता है .. और मैंने कोशिश की" .. –

उत्तर

2

निष्कर्ष:

यह XSD के साथ संभव नहीं है। आवश्यकता को प्राप्त करने की कोशिश कर रहे सभी दृष्टिकोणों को त्रुटियों के गुच्छा के साथ सत्यापन-उपकरण द्वारा "संदिग्ध" के रूप में नामित किया गया था।

1

हो सकता है कि इसके नामस्थान उपयोग करना संभव है:

<xs:element name="root" type="root"></xs:element> 
    <xs:complexType name="root"> 
    <xs:sequence> 
     <xs:any maxOccurs="2" minOccurs="0" namespace="http://ns1.com" /> 
     <xs:element name="node" type="xs:string"/> 
     <xs:any maxOccurs="2" minOccurs="0" namespace="http://ns2.com"/> 
    </xs:sequence> 
    </xs:complexType> 

यह शायद मान्य होगा।

+0

अच्छी तरह से सोचा [+1] .. लेकिन दुर्भाग्य से मेरे मामले में काम नहीं करता है। प्रतिक्रिया के लिए thanx। :-) –

3

मामले में अपने पहले से ही इस के साथ नहीं किया, तो आपको निम्न कोशिश कर सकते हैं:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="root" type="root"></xs:element> 
    <xs:complexType name="root"> 
    <xs:sequence> 
     <xs:any maxOccurs="2" minOccurs="0" processContents="skip"/> 
     <xs:element name="node" type="xs:string"/> 
     <xs:any maxOccurs="2" minOccurs="0" processContents="skip"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

लिनक्स के तहत इस xmllint libxml संस्करण 20706.

+0

हालांकि यह अभी भी पहले तत्व को किसी भी होने की अनुमति नहीं देता है! :( –

+1

समस्या क्या है, कृपया? – alk

+0

यह त्रुटि है जो मुझे मिल रही है: ** वाइल्डकार्ड '## कोई भी' तत्व 'नोड' की अनुमति देता है, और सामग्री मॉडल को संदिग्ध बनने का कारण बनता है। इसलिए और इसलिए ** –

1

का उपयोग कर मैं एक ही समस्या का सामना करना पड़ा साथ ठीक काम करता है।

चूंकि मैंने .NET से सत्यापन कहा है; मैंने कार्यप्रणाली के रूप में ValidationEventHandler में विशिष्ट सत्यापन त्रुटि को दबाने का निर्णय लिया। यह मेरे लिए काम किया।

private void ValidationEventHandler(object sender, ValidationEventArgs e) 
    { 
     switch (e.Severity) 
     { 
      case XmlSeverityType.Warning: 
       // Processing warnings 
       break; 
      case XmlSeverityType.Error: 
       if (IgnoreUnknownTags 
        && e.Exception is XmlSchemaValidationException 
        && new Regex(
         @"The element '.*' has invalid child element '.*'\." 
         + @" List of possible elements expected:'.*'\.") 
         .IsMatch(e.Exception.Message)) 
       { 
        return; 
       } 
       // Processing errors 
       break; 
      default: 
       throw new InvalidEnumArgumentException("Severity should be one of the valid values"); 
     } 
    } 

यह महत्वपूर्ण है Thread.CurrentUICulture इस के लिए मौजूदा धागा काम करने के लिए अंग्रेजी या CultureInfo.InvariantCulture करने के लिए सेट किया जाना चाहिए कि।

0

आप XML 1.1 "खुली सामग्री" कहा जाता है में एक नई सुविधा का उपयोग कर सकता। संक्षेप में, आप निर्दिष्ट करने के लिए है कि अतिरिक्त "अज्ञात" तत्वों विभिन्न पदों में जटिल प्रकार है और क्या करता है, तो यह उन तत्वों

एक्सएमएल 1 का उपयोग के किसी भी हिट पार्सर क्या करना चाहिए करने के लिए जोड़ा जा सकता है की अनुमति देता है।1, अपने जटिल प्रकार बन जाएगा:

<xs:schema ...> 
    <xs:defaultOpenContent mode="interleave"> 
    <xs:any namespace="##any" processContents="skip"/> 
    </xs:defaultOpenContent> 

    ... 
</xs:schema> 

:

<xs:element name="root" type="root" /> 
<xs:complexType name="root"> 
    <xs:openContent mode="interleave"> 
    <xs:any namespace="##any" processContents="skip"/> 
    </xs:openContent> 

    <xs:sequence> 
    <xs:element name="node" type="xs:string"/> 
    </xs:sequence> 
</xs:complexType> 

आप जटिल प्रकार के एक बहुत कुछ है, तो आप भी एक "डिफ़ॉल्ट" खुली सामग्री मोड अपने स्कीमा के शीर्ष पर सेट कर सकते हैं ओपन सामग्री के लिए डब्ल्यू 3 सी स्पेक http://www.w3.org/TR/xmlschema11-1/#oc पर पाया जा सकता है और http://www.ibm.com/developerworks/library/x-xml11pt3/#N102BA पर इसका एक अच्छा लेखन है।

दुर्भाग्य से, नेट की अभी तक मैं किसी भी मुक्त XML 1.1 प्रोसेसर नहीं मिल सकता है के रूप में XML 1.1 का समर्थन नहीं करता है - लेकिन के एक जोड़े भुगतान के विकल्प हैं:

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