【问题标题】:Making a XML tag required when serialzing (C#) [duplicate]序列化时需要 XML 标记(C#)[重复]
【发布时间】:2013-09-12 12:47:02
【问题描述】:

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

我的 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;
            }
        }
...

【问题讨论】:

  • 为什么不在序列化之前验证自己?
  • 我已经使用 XSD 文件使用 xsd.exe 生成了我的序列化对象,我认为 minOccurs="1" maxOccurs="1" 可以使我的标签成为必需,但事实并非如此!如何使我的属性“语言”需要使用属性或类似的东西?
  • @Stacked 这是 xsd.exe 忽略的一部分,而 xs:pattern 或 xsd 包括,基本上当涉及到验证内容而不是 xml 文件的结构时,您将几乎拥有序列化时自己做

标签: c# xml serialization


【解决方案1】:

我最终将 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));
    }
}

当发现错误时,会抛出异常并提供错误的详细信息。

【讨论】:

    猜你喜欢
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    相关资源
    最近更新 更多