xmlns名称空间resilency

时间:2012-12-07 12:43:14

标签: .net xml xml-namespaces xmlserializer xml-deserialization

我从服务器接收数据为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>

我有哪些选择?

1 个答案:

答案 0 :(得分:0)

你被赋予了很大的“XML”。在反序列化之前,您可以使用XML Transforms进行更正。