1

XML ファイルをオブジェクトにシリアル化しようとしています。XML タグを削除すると、XML ファイルが無効になるため例外が発生することが予想されますが、削除されたタグ (プロパティ) を持つデータ オブジェクトが null になります。 . この特定のタグを必須にする方法。シリアル化しようとすると、タグ xxx が見つからないという例外がスローされます => XML ファイルが無効です => データ オブジェクトも null です。

私のXSD

...
<xs:element name="Language" minOccurs="1" maxOccurs="1">
...

私のXML

<?xml version="1.0" encoding="iso-8859-1"?>
<root>
  <item>
    <sub1>1037</sub1>
    <Language>F</Language><!-- If I delete this tag, my XML file should be invalid -->
    <sub1>ZDC</sub1>
  </item>
 <root>

私のシリアル化ボジェクト

...
        /// <remarks/>
        public string Language
        {
            get
            {
                return this.languageField;
            }
            set
            {
                this.languageField = value;
            }
        }
...
4

1 に答える 1

2

最終的に、XSD ファイルをソリューションに埋め込みリソースとして追加し、次の方法を使用しました。

public static void ValidateXmlFile<T>(string file, string xsdPath)
{
    var assembly = typeof(T).Assembly;
    var assName = assembly.GetName().Name;
    var xsdFullPath = String.Format("{0}.{1}", assName, xsdPath);
    var schema = assembly.GetManifestResourceStream(xsdFullPath);
    if (schema == null)
        throw new Exception(String.Format("{0} could not be validated, the XSD schema {1} not found", file, xsdFullPath));
    var xmlIsValid = true;
    var errorMsg = String.Empty;
    var schemaReader = XmlReader.Create(schema);
    var settings = new XmlReaderSettings();
    settings.Schemas.Add(null, schemaReader);
    settings.ValidationType = ValidationType.Schema;
    settings.ValidationEventHandler += (sender, args) =>
    {
        xmlIsValid = false;
        errorMsg = args.Message;
    };

    using (var stream = new FileStream(file, FileMode.Open))
    {
        var xr = XmlReader.Create(stream, settings);
        while (xr.Read()) { }
        if (!xmlIsValid) throw new Exception(String.Format("XML file {0} is not valid: {1}", file, errorMsg));
    }
}

エラーが見つかると、エラーの詳細とともに例外がスローされます。

于 2013-09-17T12:00:59.563 に答える