【问题标题】:Deserializing xml that contains an invalid data type反序列化包含无效数据类型的 xml
【发布时间】:2012-10-10 13:41:57
【问题描述】:

我有一个 XML 文件,我需要将其反序列化为一个类似的对象:

public class TestObject
{
    public string Name { get; set; }
    public int Size { get; set; }

    public TestObject()
    {
        Name = string.Empty;
        Size = 0;
    }
}

我的反序列化方法如下所示:

private TestObject DeserializeConfiguration(string xmlFileName)
{
    XmlSerializer deserializer = new XmlSerializer(typeof(TestObject));
    TextReader textReader = new StreamReader(xmlFileName);
    TestObject testObj = (TestObject)deserializer.Deserialize(textReader);
    textReader.Close();
    return testObj;
}

这对我来说已经足够好了,但有时我会得到一个可能包含无效数据类型的 XML 文件(“无效”是指它应该映射到的对象属性的类型)。例如,如果我的 XML 文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<TestObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>Orion</Name>
  <Size>abc</Size>
</TestObject>

显然我无法将“abc”转换为对象的整数 Size 属性。当我尝试反序列化它时,我看到一个 InvalidOperationException 并且毫不奇怪,InnerException 是“输入字符串的格式不正确”。是否可以捕获此错误,为我的对象的该属性使用默认值并继续反序列化 XML 文件的其余部分?如果没有,谁能告诉我在反序列化期间处理无效数据是否存在普遍认为的“最佳实践”?

【问题讨论】:

  • 修复你的错误处理。 &lt;size&gt;abc&lt;/size&gt; 应该被拒绝,而不是转换。

标签: c# .net serialization xml-serialization


【解决方案1】:

您需要做的是在反序列化之前验证传入的 XML。基本上,您希望避免处理格式错误的 XML。验证后,反序列化器至少可以确保所有传入的 XML 都是可反序列化的。

您可以创建一个包含有效 XML 定义的 XML 架构,然后首先使用 XSD(XML 架构定义)验证传入的 XML(有关详细信息,另请参阅 http://www.codeguru.com/csharp/csharp/cs_data/xml/article.php/c6737/Validation-of-XML-with-XSD.htm)。

祝你好运!

【讨论】:

  • 这并不是问题的真正答案。这不是一个好主意,但在某些情况下,您可能有错误的 XML,需要捕获和处理问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
相关资源
最近更新 更多