1

我正在尝试将 XML 文件序列化为对象,在删除 XML 标记时,我期待出现异常,因为我的 XML 文件不再有效,但我仍然得到带有已删除标记(属性)的数据对象为空. 如何使这个特定的标签成为必需的,所以在尝试序列化它时,它会抛出一个异常,说标签 xxx 丢失 => XML 文件无效 => 所以数据对象也是空的。

我的 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 回答