2013-02-26 155 views
8

मान लें कि मेरे पास एक स्कीमा है जिसके साथ मैं एक इनपुट दस्तावेज़ का अनुपालन करना चाहता हूं। मैं इस प्रकार स्कीमा के अनुसार फ़ाइल लोड करता हूं:मैं .NET में दिए गए स्कीमा के अनुपालन को कैसे मजबूर कर सकता हूं?

// Load the ABC XSD 
var schemata = new XmlSchemaSet(); 
string abcSchema = FooResources.AbcTemplate; 
using (var reader = new StringReader(abcSchema)) 
using (var schemaReader = XmlReader.Create(reader)) 
{ 
    schemata.Add(string.Empty, schemaReader); 
} 

// Load the ABC file itself 
var settings = new XmlReaderSettings 
{ 
    CheckCharacters = true, 
    CloseInput = false, 
    ConformanceLevel = ConformanceLevel.Document, 
    IgnoreComments = true, 
    Schemas = schemata, 
    ValidationType = ValidationType.Schema, 
    ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings 
}; 

XDocument inputDoc; 
try 
{ 
    using (var docReader = XmlReader.Create(configurationFile, settings)) 
    { 
     inputDoc = XDocument.Load(docReader); 
    } 
} 
catch (XmlSchemaException xsdViolation) 
{ 
    throw new InvalidDataException(".abc file format constraint violated.", xsdViolation); 
} 

यह फ़ाइल में छोटी त्रुटियों का पता लगाने में ठीक काम करता है। हालांकि, क्योंकि स्कीमा एक नाम स्थान के लिए बंद कर दिया जाता है, निम्नलिखित की तरह एक दस्तावेज़ अमान्य है, लेकिन के माध्यम से sneaks:

<badDoc xmlns="http://Foo/Bar/Bax"> 
    This is not a valid document; but Schema doesn't catch it 
    because of that xmlns in the badDoc element. 
</badDoc> 

मैं कहना है कि केवल नामस्थान जिसके लिए मैं स्कीमेता है स्कीमा प्रमाणीकरण पास करना चाहिए चाहते हैं।

उत्तर

-1

रिपोर्ट प्रमाणीकरण चेतावनी ध्वज सेट करें। http://msdn.microsoft.com/en-us/library/system.xml.schema.xmlschemavalidationflags.aspx और http://msdn.microsoft.com/en-us/library/system.xml.xmlreadersettings.validationflags.aspx देखें।

settings.ValidationEventHandler += 
    (node, e) => Console.WriteLine("Bad node: {0}", node); 
+1

काम नहीं किया। अभी भी अमान्य दस्तावेज़ पास करने देता है। तदनुसार अद्यतन उदाहरण कोड। –

2

के रूप में के रूप में ऐसा लगता है बेवकूफ, बात आप को देखने के लिए चाहते हैं XmlReaderSettings वस्तु पर वास्तव में है मुझे आशा है। यदि ऐसा नहीं है, तो मैं उसी तरह से इलाज करता हूं जैसे मैं एक सच्ची स्कीमा सत्यापन विफलता का इलाज करता हूं:

// Parse the bits we need out of that file 
var rootNode = inputDoc.Root; 
if (!rootNode.Name.NamespaceName.Equals(string.Empty, StringComparison.Ordinal)) 
{ 
    throw new InvalidDataException(".abc file format namespace did not match."); 
} 
+0

@codekaizen - हां, काफी उचित है, यह एक "बेहतर" उदाहरण है, हालांकि मुझे अपने मूल के निहित आश्चर्य की तरह था :) – JerKimball

+0

सहमत हैं, लेकिन कुछ कारण हो सकता है (उदाहरण के लिए पूरे ढेर और पार्स राज्य को कचरा नहीं) हालांकि, यह शायद ही कभी आश्चर्यजनक नहीं है क्योंकि मुझे उम्मीद है कि इस बेवकूफ को उजागर करने के लिए "बेवकूफ" उपहास सभी जिम्मेदारी लेगा। – codekaizen

+0

@codekaizen यह आपके लिए अत्यधिक राजनयिक है; सम्मान हासिल किया। :) – JerKimball

1

समाधान मैं है पर बसने से मूल रूप से जाँच करने के लिए है कि रूट नोड नाम स्थान में है समाप्त हो गया: