1

Microsoft の xsd.exe を使用してクラス CustomerData を作成する Xml スキーマ CustomerData.xsd があります。

私のプログラムは、Xml ファイルを読み取り、XmlSerializer を使用して、次のコードを使用して CustomerData のインスタンスを取得します。

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

プログラムの実行中に customerData を変更することができ、スキーマによっては一部の値が無効になる可能性があります。

ユーザーがこのデータをファイルに保存する前に、それを検証できるようにしたいと考えています。保存する前にデータを検証するにはどうすればよいですか?

注 - 次のようなコードを使用してスキーマにアクセスできるように、スキーマを埋め込みリソースとしてコンパイルします。

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;

私は次に何をすべきか分からない。

4

1 に答える 1

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
于 2013-07-23T22:31:32.423 に答える