2013-02-26 16 views
8

ı ı bir giriş belge uymak istediğiniz bir şema var diyelim. Böyle şemaya göre dosyasını yüklemek:.NET'te verilen bir şemaya uyumu nasıl zorlayabilirim?

// 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); 
} 

Bu dosyada önemsiz hataları tespit çalışıyor. Şema, bir ad alanına kilitli olduğundan Ancak, aşağıdaki gibi bir belge geçersiz olduğunu, ancak içinden gizlice:

<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> 

Ben schemata sahip olduğunuz tek ad şema doğrulama geçmek gerektiğini söylemek istiyorum.

cevap

2

olarak aptal, sen bakmak istiyorum şey XmlReaderSettings nesne üzerinde aslında Bekliyorum, umuyorum. Değilse, o zaman ben de doğru bir şema doğrulama hatasını ele aldığımı kabul ediyorum:

// 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 - hah, yeterince adil, ben zımni şaşkınlık gibi her ne kadar o, "daha iyi" örnek benim orijinal :) – JerKimball

+0

için (örneğin bütün yığını ve ayrıştırma durumunu atma değil) Kabul, ama bazı nedeni olabilir Ancak, pek de şaşırtıcı olmayan bir şey olsa da, “bu aptal” ın bu bükümü vurgulamak için tüm sorumluluğu alacağını umuyorum. – codekaizen

+0

@codekaizen Bu, sizin için fazlasıyla diplomatik; Saygı duyuldu. :) – JerKimball

1

temelde kök düğümü ad olup olmadığını kontrol etmektir yerleşmeden sona erdi çözüm: göründüğü gibi

İlgili konular