【问题标题】:Deserialize xml. xmlns='http//someaddress' was not expected反序列化 xml。 xmlns='http//someaddress' 不是预期的
【发布时间】:2015-06-11 20:45:19
【问题描述】:

我的问题是将 xml 反序列化为 c# 对象。我有一些从其他类派生的类(我有理由需要在这个地方使用继承——不管为什么):

[Serializable]
[XmlType(TypeName = "OTA_HotelResRQ")]
public class ResRQ : OTA_HotelResRQ
{
}

在 OTA_HotelResRQ 我已经声明了命名空间和其他信息:

[Serializable]
[XmlTypeAttribute(Namespace = "http://www.opentravel.org/OTA/2003/05")]
[XmlRootAttribute(Namespace = "http://www.opentravel.org/OTA/2003/05", IsNullable = false)]
public class OTA_HotelResRQ : OtaRequestMessage, IRequest

当我尝试序列化一些如下所示的请求时:

<ns:OTA_HotelResRQ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:ns="http://www.opentravel.org/OTA/2003/05" 
                PrimaryLangID="en" EchoToken="5613971064477293649" ResStatus="Commit" Version="2.1">
...SOME REQUEST WITH NS:....
<ns:POS><ns:/POS>

现在当我尝试反序列化时,我有:

There is an error in XML document (3, 2). ---> System.InvalidOperationException: <OTA_HotelResRQ xmlns='http://www.opentravel.org/OTA/2003/05'> was not expected.

你知道为什么我不能反序列化吗?我不能为我的模型修改基类,而且我需要有“ns”前缀,因为我要发送的服务需要这种格式。

更新:

我的反序列化已实现,我从字符串中获取字节并尝试使用以下方法进行反序列化:

return (T) new XmlSerializer(typeof (T)).Deserialize(new MemoryStream(bytes));

我尝试使用 Charles 提供的解决方案修复它并更新了我的模型:

[Serializable]
[XmlRoot("OTA_HotelResRQ", Namespace = "http://www.opentravel.org/OTA/2003/05")]
[XmlType("OTA_HotelResRQ", Namespace = "http://www.opentravel.org/OTA/2003/05")]
public class ResRQ : OTA_HotelResRQ
{
}

但仍然没有成功。当我尝试反序列化时,我得到了异常:

Types 'OTA_HotelResRQ' and
 'ResRQ' both use the XML type name, 
'OTA_HotelResRQ', from namespace 'http://www.opentravel.org/OTA/2003/05'. Use 
XML attributes to specify a unique XML name and/or namespace for the type.

【问题讨论】:

  • “我需要有“ns”前缀,因为我要发送的服务需要这种格式”——除非服务写得很糟糕,否则你不需要。命名空间前缀对于特定的 XML 文档是本地的。这两段 XML &lt;a:thing xmlns:a="http://example.com"/&gt;&lt;b:thing xmlns:b="http://example.com"/&gt; 应该 被同等对待。 (应该&lt;thing xmlns="http://example.com"/&gt;
  • 不错,需要前缀
  • 是的,很糟糕,如果它依赖于 specific 前缀。正如我所说,前缀应该只在本地有意义。重要的是命名空间本身(我之前评论中的所有三个示例都是来自 http://example.com 命名空间的 thing 元素)
  • ok 没关系。我可以删除这个派生类,但我仍然遇到与 OTA_HotelResRQ xmlns='opentravel.org/OTA/2003/05'> 预期相同的错误
  • 好的,我更改了类型名称,然后出现了问题。现在它正在工作,我可以使用 ns 前缀创建和反序列化请求。我不知道如何使用派生类来做到这一点,但在这种情况下不再需要这样做。感谢您的帮助

标签: c# serialization xml-namespaces xml-deserialization


【解决方案1】:

XML 属性are not inherited,因此您需要在派生类中添加XmlRoot 属性:

[Serializable]
[XmlRoot("OTA_HotelResRQ", Namespace = "http://www.opentravel.org/OTA/2003/05")]
public class ResRQ : OTA_HotelResRQ
{
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-03-23
  • 2010-12-06
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
  • 2021-03-06
相关资源
最近更新 更多