我从服务器接收数据为utf-8编码的xml消息,看起来像
<?xml version="1.0" encoding="utf-8"?>
<Data namespace="http://example.com/data">
...
</Data>
关于该示例的值得注意的事情是“namespace”限定符实际上应该是指定默认xml名称空间的“xmlns”限定符。序列化/反序列化的代码是从模式定义文件生成的(自动),并且xsd以及随附的文档几乎都证实这是一个错误。
但是,这也意味着Data对象现在位于全局/空命名空间(xmlns =“”)中,并且自动生成的代码失败,典型的"There is an error in XML document ..."
和"<Data xmlns=''> was not expected."
类型的异常XmlSerialzier在反序列化期间抛出,人们看到反序列化属性/代码的名称空间和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>
我有哪些选择?
答案 0 :(得分:0)
你被赋予了很大的“XML”。在反序列化之前,您可以使用XML Transforms进行更正。