2012-01-09 12 views
5

मैं XDocument.Validate एक्सटेंशन विधि के साथ Xml स्कीमा का उपयोग करके एक एक्सएमएल खंड को सत्यापित करने का प्रयास कर रहा हूं। जब भी एक अमान्य XML टुकड़ा ValidationEventHandler आग ठीक से प्रयोग किया जाता है, लेकिन दोनों XmlSchemaValidationException की LineNumber और LinePosition गुण 0.XmlSchemaValidationException.LineNumber और LinePosition 0DDocument के साथ Xml स्कीमा को सत्यापित करते समय 0 हैं। वैलिडेट

private bool Validate(XDocument doc) 
{ 
    bool isValid = true; 
    List<string> validationErrors = new List<string>(); 

    XmlSchemaSet schemas = new XmlSchemaSet(); 
    schemas.Add(null, "MyCustomSchema.xsd"); 

    doc.Validate(schemas, (sender, args) => 
    { 
     validationErrors.Add(String.Format("{0}: {1} [Ln {2} Col {3}]", 
      args.Severity, 
      args.Exception.Message, 
      args.Exception.LineNumber, 
      args.Exception.LinePosition)); 

     isValid = false; 
    }, false); 

    return isValid; 
} 
हैं

ऊपर के उदाहरण में मेरा लक्ष्य के रूप में एक उपयोगकर्ता सूचित करने के लिए validationErrors उपयोग करने के लिए कारण है कि प्रमाणीकरण विफल रहा। जब इस विधि का उपयोग किया जाता है, हालांकि, लाइन नम्बर और लाइनपोजिशन दोनों 0

स्निपेट काफी सरल लगता है और मान्य और अमान्य एक्सएमएल टुकड़ों दोनों के खिलाफ सत्यापन के मामले में अपेक्षित काम करता है।

अग्रिम धन्यवाद!

+0

जहां तक ​​मैं XmlSchemaValidator को देख सकता हूं जो तत्काल हो जाता है केवल एक आंतरिक डमीपोस्टियन का उपयोग करता है और मुझे बेहतर कार्यान्वयन इंजेक्शन प्राप्त करने का विकल्प नहीं दिखाई देता है। – rene

उत्तर

4

आप अब एक्सएमएल के पाठपरक प्रतिनिधित्व को मान्य नहीं कर रहे हैं लेकिन ऑब्जेक्ट मॉडल। नतीजतन कोई लाइनें और पद नहीं हैं क्योंकि स्मृति में XElement, XAttribute आदि ऑब्जेक्ट्स के अलावा कोई फ़ाइल नहीं है। एक और सहायक संकेत खुद से पूछना होगा - अगर आपने संशोधित किया था तो एक्सडोक्यूमेंट को संशोधित करने के बाद यदि आप संशोधित (उदाहरण के लिए एक एलीमेंट जोड़ा गया था) लेकिन सत्यापन चलाने से पहले क्या लाइन और स्थिति वापस की जानी चाहिए? यदि आप एक्सएमएल को बना या संशोधित नहीं कर रहे हैं तो सबसे तेज़ तरीका XmlReader का उपयोग अपने एक्सएमएल दस्तावेज़ को सत्यापित करने के लिए करना होगा। बोनस के रूप में - यदि इनपुट एक फ़ाइल या स्ट्रीम है - आपको सत्यापन त्रुटियों के मामले में लाइन और स्थिति जानकारी प्राप्त करनी चाहिए।

+0

पावेल, आपकी बहुत ही उचित प्रतिक्रिया के लिए धन्यवाद। मैं XDocument के खिलाफ मान्य करना चाहता था, क्योंकि मेरे पास पहले से ही एक संदर्भ था। मैं अपने ऐप को XmlReader के विरुद्ध सत्यापित करने के लिए बदल दूंगा, और फिर नीदर होने पर XDocument संदर्भ बनाउंगा। – buckindb

+0

मुझे लगता है कि आप एक ही समय में दोनों करने में सक्षम होना चाहिए - आप पाठक को सेट अप कर सकते हैं ताकि यह दस्तावेज़ को मान्य कर सके और फिर पाठक को XDocument.Load() विधि में पास कर दें ... – Pawel