我从服务器接收数据作为 utf-8 编码的 xml 消息,看起来像
<?xml version="1.0" encoding="utf-8"?>
<Data namespace="http://example.com/data">
...
</Data>
该示例值得注意的是,“命名空间”限定符实际上应该是指定默认 xml 命名空间的“xmlns”限定符。序列化/反序列化的代码是(自动)从模式定义文件生成的,xsd 以及随附的文档都几乎证实这是一个错误。
但是,这也意味着 Data 对象现在位于全局/空命名空间 (xmlns="") 中,并且自动生成的代码失败,并出现 XmlSerialzier 在反序列化过程中抛出的典型"There is an error in XML document ..."
异常"<Data xmlns=''> was not expected."
类型,人们在反序列化的命名空间中看到这种异常属性/代码和xml文件不匹配。
虽然修改自动生成的代码并将Namespace
定义“修复”为例如是相当容易的
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class Data {
我真正希望的是命名空间的弹性——也就是说,如果在未来某个时间问题由为我提供数据的人解决,我不希望被迫再次调整Namespace
代码中的定义(任何 xmlns 更改将打破上述异常的反序列化代码)。
也就是说,我想要能够同时处理上述错误 xml 以及例如的代码
<?xml version="1.0" encoding="utf-8"?>
<Data xmlns="http://example.com/data">
...
</Data>
甚至(例如,如果他们决定“向后兼容”)
<?xml version="1.0" encoding="utf-8"?>
<Data xmlns="http://example.com/data" namespace="http://example.com/data">
...
</Data>
我有什么选择?