2013-07-23 1 views
1

Microsoft의 xsd.exe를 사용하여 CustomerData 클래스를 만드는 XML 스키마 인 CustomerData.xsd가 있습니다. 내 프로그램은 XML 파일에 읽고파일에 저장하기 전에 직렬화 된 XML 유효성 검사

는 다음 코드를 사용하여 CustomerData의 인스턴스를 얻기 위해 XmlSerializer를 사용 : 내 프로그램이 customerData 수정할 수 있습니다 실행되는 동안

XmlSerializer serializer = new XmlSerializer(typeof(CustomerData)); 
TextReader textReader = new StreamReader(fileName); 
CustomerData customerData = (CustomerData)serializer.Deserialize(textReader); 
textReader.Close(); 

및 가능성이있는 값의 일부는 수도 스키마에 따라 유효하지 않습니다.

사용자가이 데이터를 파일에 저장하기 전에 유효성을 검사 할 수 있기를 원합니다. 저장하기 전에 데이터의 유효성을 검사하려면 어떻게해야합니까?

주 - 나는 포함 리소스로 스키마가 그래서 같은 스키마에 도착하는 다음과 같은 코드를 사용할 수 있습니다 컴파일 :

Assembly myAssembly = typeof(CustomerData).Assembly; 
Stream schemaStream = myAssembly.GetManifestResourceStream(schemaResourceName); 

나는 또한 검증 SchemaReader 만드는 방법을 알고 :

XmlReader schemaReader = XmlReader.Create(schemaStream); 
XmlReaderSettings settings = new XmlReaderSettings(); 
settings.Schemas.Add(null, schemaReader); 
settings.ValidationType = ValidationType.Schema; 

나는 다음에 무엇을 해야할지 모르겠다.

답변

0

코드 변경을 최소화 만들기 :

// Get the data that the customer has entered 
TextReader textReader = new StreamReader(fileName); 

// Create the validating reader 
XmlReader schemaReader = XmlReader.Create(schemaStream); 
XmlReaderSettings settings = new XmlReaderSettings(); 
settings.Schemas.Add(null, schemaReader); 
settings.ValidationType = ValidationType.Schema; 
var documentReader = XmlReader.Create(textReader, settings); 

// Use the validating reader to read 
try 
{ 
    while (documentReader.Read()) 
    { 
    } 
} 
catch (XmlSchemaValidationException ex) 
{ 
    //do logging or whatever here 
} 

을하지만 XmlReader를보다 오히려을 XmlDocument를 사용하는 약간 덜 코드 :

// Get the data that the customer has entered 
TextReader textReader = new StreamReader(fileName); 

// Create an XmlDocument to read the data 
XmlDocument xmlDocument = new XmlDocument(); 

// Attach the schema to the XmlDocument 
xmlDocument.Schemas = new XmlSchemaSet(); 
xmlDocument.Schemas.Add(null, new XmlTextReader(schemaStream)); 

// Load the document and validate it 
xmlDocument.Load(textReader); 
List<String> errors = new List<String>(); 
xmlDocument.Validate((sender, eventArgs) => errors.Add(eventArgs.Message)); 
// the errors list will now contain a list of schema errors