2013-01-21 56 views
5

मेरे पास XDocument है जो मैं एक XML स्कीमा के विरुद्ध मान्य करता हूं। जब XDocument अमान्य है तो मुझे अमान्य XML नोड्स को खोजने की आवश्यकता है ताकि उपयोगकर्ता आसानी से मेरे एप्लिकेशन में संबंधित स्थान पर जा सके (उदा। संदेश ग्रिड पर किसी संदेश को डबल-क्लिक करके)।XDocument में अमान्य XML नोड को कैसे खोजें जो स्कीमा के खिलाफ मान्य है (XmlSchemaValidationException.SourceObject शून्य है)

मैं उस उद्देश्य के लिए System.Xml.Schema.Validate() विस्तार विधि का उपयोग करता हूं। मान्य() विधि का दूसरा तर्क System.Xml.ValidationEventHandler है जिसे प्रत्येक अवैध XML तत्व पर बुलाया जाता है। यह System.Xml.ValidationEventArgs पास करता है। ValidationEventArgs.Exception को System.Xml.Schema.XmlSchemaValidationException पर जाया जा सकता है। अब XmlSchemaValidationException में संपत्ति SourceObject है जो मुझे अमान्य XML नोड का संदर्भ रखने की उम्मीद है। दुर्भाग्य से यह हमेशा शून्य है।

XDocument doc = XDocument.Load(@"c:\temp\booksSchema.xml"); 

// Create the XmlSchemaSet class. 
XmlSchemaSet sc = new XmlSchemaSet(); 

// Add the schema to the collection. 
sc.Add("urn:bookstore-schema", @"c:\temp\books.xsd"); 

// Validate against schema 
doc.Validate(sc, delegate(object sender, ValidationEventArgs e) 
       { 
        XmlSchemaValidationException ve = e.Exception as XmlSchemaValidationException; 
        if (ve != null) 
        { 
         object errorNode = ve.SourceObject;  
         // ve.SourceObject is always null 
        } 
       }); 

मान्यता ही ठीक से काम करता है, लेकिन मैं अमान्य नोड पर एक संदर्भ नहीं मिल सकता है:

निम्नलिखित टुकड़ा मेरी उपयोग दिखाता है। आश्चर्यजनक रूप से, एक ही दृष्टिकोण System.Xml.XmlDocument के लिए अच्छा काम करता है, लेकिन दुर्भाग्य से मुझे इस संदर्भ में XDocument के साथ काम करना चाहिए।

क्या किसी के पास कोई सुझाव है कि XDocument में अमान्य नोड कैसे पाया जा सकता है?

उत्तर

6

ठीक है, मेरे पास जवाब है। अमान्य नोड इवेंट हैंडलर का "प्रेषक" स्वयं है। इसे XContainer, XElement, में डाला जा सकता है ...