2011-10-22 17 views
6

मान्य यह इस सवाल C# Get schema information when validating xmlकब्जा स्कीमा सूचना जब XDocument

हालांकि, मैं LINQ प्रयोजनों के लिए एक XDocument साथ काम कर रहा हूँ के समान है।

मैं CSV फ़ाइलों का एक सेट पढ़ रहा/विश्लेषण कर रहा हूं और एक्सएमएल में परिवर्तित कर रहा हूं, फिर एक्सएसडी स्कीमा के खिलाफ एक्सएमएल को मान्य कर रहा हूं।

मैं तत्व मानों से संबंधित विशिष्ट त्रुटियों को कैप्चर करना चाहता हूं, और अधिक उपयोगकर्ता के अनुकूल संदेश उत्पन्न करना चाहता हूं, और उन्हें उपयोगकर्ता को वापस देना ताकि इनपुट डेटा को सही किया जा सके। आउटपुट डेटा में जो आइटम मैं शामिल करना चाहता हूं उनमें से एक है कुछ स्कीमा जानकारी (जैसे कि संख्यात्मक प्रकार के लिए स्वीकार्य मूल्यों की सीमा)।

मेरे वर्तमान दृष्टिकोण (जो मैं बदलने के लिए खुला हूं) में, मैं स्कीमा जानकारी को छोड़कर मुझे जो भी चाहिए, उसे कैप्चर करने में सक्षम हूं।

मैंने SourceSchemaObject को ValidationEventArgs प्रमाणीकरण ईवेंट हैंडलर के तर्क में पहुंचने का प्रयास किया है, लेकिन यह हमेशा शून्य है। मैंने XElement के GetSchemaInfo को भी आजमाया है और यह भी शून्य दिखता है।

मैं विशिष्ट सत्यापन त्रुटियों की पहचान करने के लिए RegEx का उपयोग कर रहा हूं, जिसे मैं कैप्चर करना चाहता हूं, और सत्यापन ईवेंट हैंडलर के प्रेषक तर्क के माध्यम से XElement से डेटा को पकड़ना।

private List<String> this.validationWarnings; 
private XDocument xDoc; 
private XmlSchemaSet schemas = new XmlSchemaSet(); 

public List<String> Validate() 
{ 
    this.validationWarnings = new List<String>(); 

    // the schema is read elsewhere and added to the schema set 
    this.xDoc.Validate(this.schemas, new ValidationEventHandler(ValidationCallBack), true); 

    return validationWarnings 
} 

है और यहाँ: मैं एक XDocument को स्कीमा बदलने और हथियाने क्या मैं LINQ के माध्यम से की जरूरत के बारे में सोचा है, लेकिन यह मेरे लिए है कि एक बेहतर विकल्प होना चाहिए लगता है

यहाँ मेरे वर्तमान मान्य विधि है मेरी कॉलबैक विधि:

private void ValidationCallBack(object sender, ValidationEventArgs args) 
{   
    var element = sender as XElement; 

    if (element != null) 
    { 

     // this is a just a placeholder method where I will be able to extract the 
     // schema information and put together a user friendly message for specific 
     // validation errors  
     var message = FieldValidationMessage(element, args); 

     // if message is null, then the error is not one one I wish to capture for 
     // the user and is related to an invalid XML structure (such as missing 
     // elements or incorrect order). Therefore throw an exception 
     if (message == null) 
      throw new InvalidXmlFileStructureException(args.Message, args.Exception); 
     else 
      validationWarnings.Add(message); 

    } 
} 

मेरी कॉलबैक विधि में var message = FieldValidationMessage(element, args); लाइन बस एक प्लेसहोल्डर है और मौजूद नहीं है अभी तक इस विधि के इरादे 3 काम करने के लिए है:

  1. args.Message पर RegEx का उपयोग करके विशिष्ट सत्यापन त्रुटियों को पहचानें (यह पहले से ही काम करता है, मैं पैटर्न है कि मैं उपयोग करने की योजना का परीक्षण किया है)

  2. ले लो कि त्रुटि पैदा विशिष्ट XElement से संबंधित XDocument से विशेषता मान (जैसे मूल सीएसवी में पंक्ति और कॉलम संख्या)

  3. स्कीमा जानकारी प्राप्त करें यदि यह उपलब्ध है तो फील्ड प्रकार और प्रतिबंध आउटपुट संदेश में जोड़े जा सकते हैं।

उत्तर

6

किसी को जो भविष्य में इस प्रश्न पढ़ता के लिए, मैं मेरी समस्या हल करने के लिए, एक से थोड़ा अलग तरीके से यद्यपि से मैं मूल रूप से प्रस्तावित कामयाब रहे।

पहली समस्या जो मैं कर रहा था, कि स्कीमाइन्फो दोनों ValidationEventArgs में और XElement के GetSchemaInfo एक्सटेंशन विधि दोनों शून्य थे। मैंने हल किया कि जिस तरह से मैंने मूल रूप से लिंक किया था उसी तरह ....

List<XElement> errorElements = new List<XElement>(); 

serializedObject.Validate((sender, args) => 
{ 
    var exception = (args.Exception as XmlSchemaValidationException); 

    if (exception != null) 
    { 
     var element = (exception.SourceObject as XElement); 

     if (element != null) 
      errorElements.Add(element); 
    } 

}); 

foreach (var element in errorElements) 
{ 
    var si = element.GetSchemaInfo(); 

    // do something with SchemaInfo 
} 

ऐसा लगता है कि स्कीमा जानकारी सत्यापन कॉलबैक के बाद जब तक XObject को नहीं जोड़ा गया है, इसलिए यदि आप सत्यापन कॉलबैक के बीच में यह तक पहुँचने का प्रयास, यह शून्य हो जाएगा, लेकिन अगर आप पर कब्जा तत्व, फिर वैध विधि के पूरा होने के बाद पहुंच, यह शून्य नहीं होगा।

हालांकि, यह एक और समस्या खुल गई। SchemaInfo ऑब्जेक्ट मॉडल अच्छी तरह से प्रलेखित नहीं है और मुझे जो चाहिए उसे ढूंढने के लिए मुझे इसे पार्स करने में परेशानी थी।

मैंने अपने मूल प्रश्न पूछने के बाद यह question पाया। स्वीकार्य उत्तर वास्तव में महान blog पोस्ट जो लिंक SchemaInfo ऑब्जेक्ट मॉडल को तोड़ देता है। मेरे उद्देश्यों के अनुरूप कोड को परिशोधित करने के लिए मुझे थोड़ा सा काम आया, लेकिन यह किसी भी XmlReader तत्व (जिसे मैं XObject के साथ काम करने में सक्षम था) के लिए SchemaInfo कैसे प्राप्त करना है, यह दिखाने का एक अच्छा काम करता है।