C# 反序列化soap消息
我有一个提供者extern,它将xml发送给我进行测试C# 反序列化soap消息,c#,soap,xml-serialization,deserialization,C#,Soap,Xml Serialization,Deserialization,我有一个提供者extern,它将xml发送给我进行测试 <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Header>
<AVCabeza transactionID="000032" xmlns="http://webservices.patito/Core/">
<Solicitor entityID="WEST" systemType="WEB" />
</AVCabeza>
</soap:Header>
<soap:Body>
<Availability xmlns:a="http://webservices.patito/Availability/"
xmlns:hc="http://webservices.patito/Common/" summaryOnly="true"
xmlns="http://webservices.patito/og/Availability.wsdl">
<a:AvailabilityDetail availReqType="Room">
<a:Estadia>
<hc:StartDate>2009-01-05T00:00:00.0000000-05:00</hc:StartDate>
<hc:EndDate>2009-01-06T00:00:00.0000000-05:00</hc:EndDate>
</a:Estadia>
<a:HotelSearchCriteria>
<a:HotelRef chainCode="WC"/>
</a:HotelSearchCriteria>
</a:AvailabilityDetail>
</Availability>
</soap:Body>
</soap:Envelope>
所以,返回该错误
分析错误,没有与Xml键“AVCabeza”“\u P1”关联的程序集
调试我发现_P1等于什么“http://webservices.patito/Core/"
显然找不到“类型”AVCabeza类
怎么了
新更新
看,那是提供者给我的
一个具有该结构的文件夹
root
|
-- WSDL_XSD
| |-XSD
| | files with extension .xsd
| |
| --WS
| files with extension .wsdl
|-- XMLSamples
|-files with xml extension that contain soap messsages
我删除了xml(上一个示例)的头部
<?xml version="1.0" encoding="utf-8"?>
<Availability xmlns:a="http://webservices.patito/Availability/"
xmlns:hc="http://webservices.patito/Common/" summaryOnly="true"
xmlns="http://webservices.patito/og/Availability.wsdl">
<a:AvailabilityDetail availReqType="Room">
<a:Estadia>
<hc:StartDate>2009-01-05T00:00:00.0000000-05:00</hc:StartDate>
<hc:EndDate>2009-01-06T00:00:00.0000000-05:00</hc:EndDate>
</a:Estadia>
<a:HotelSearchCriteria>
<a:HotelRef chainCode="WC"/>
</a:HotelSearchCriteria>
</a:AvailabilityDetail>
</Availability>
2009-01-05T00:00:00.0000000-05:00
2009-01-06T00:00:00.0000000-05:00
并将尝试获取可反序列化的可用性对象,但未通过此标记
not expected "<Availability .."
not expected”SoapFormatter不是XML序列化程序。应使用XmlSerializer类
另外,这是一个完整的SOAP消息,最好让他们给您WSDL并使用“添加服务引用”“。这将为您提供将为您执行序列化和反序列化的类。当您使用xsd.exe从该XML文档生成C#类时,第一步您将获得5个单独的.xsd文件,提供
XSD模式从消息中“推断”。(有许多XSD文件,因为您在该消息中使用了许多XML名称空间)
特别是,XSD.exe将生成代码来描述SOAP信封,包括正文和标题。这可能不是您想要或需要做的事情,但是xsd.exe工具可以推断整个XML文档的类型
此外,xsd.exe中的推理机是
不精确的例如,Estadia元素的“StartDate”和“EndDate”子元素似乎是日期。但是xsd.exe不会做出这样的假设;它将生成一个XML模式,将这些东西标记为字符串。xsd.exe还做出了其他类似的假设。在所有情况下,您可能都希望修改生成的xsd文件,以符合您真正的期望。对于StartDate和EndDate,您希望将类型从xs:string
修改为xs:dateTime
此时,您可以使用/c开关在.xsd文件上再次运行xsd.exe以生成.cs源代码。编译它以获得可用于序列化的类
要使用生成的代码反序列化,请执行以下操作:
XmlSerializer s1 = new XmlSerializer(typeof(Carlos.Envelope));
Envelope envelope = null;
using(var reader= System.IO.File.OpenText("SampleMessage.xml"))
{
envelope = (Envelope) s1.Deserialize(reader);
}
然后,您可以打开信封对象并获取其中的各种数据
退一步,你会发现你可能不应该这样做。查看一条示例消息,向您展示在线上的内容应该是什么样子,这是非常有用和方便的。但是,当生成代码来处理序列化到这些消息的类时,最好从源XSD开始,它可能在服务端可用。这就是约翰·桑德斯在回答中所说的
如果您的人员可以生成一条示例消息,那么他们可能拥有该消息的XSD(或等效的WSDL)。这将消除对您推断xsd的要求,然后通过我上面描述的不精确过程对其进行修改以更改已破坏的假设
唯一需要这样做的时候是,如果您不知何故丢失了原始的XSD/WSDL,并且需要重新生成它 很抱歉,我不能添加web引用,因为存在用于该工作的公共对象,我使用5 a 8服务,这会导致冲突,所以我使用wsdl创建了一个代理,并生成所有类。如果您使用WSDL创建了一个代理,那么您所做的事情与“添加Web引用”所做的相同。这意味着您不需要自己进行序列化。谢谢Cheeso,这是提供者给我的一个文件夹,它的根是WSDL|XSD|XSD(扩展名为.XSD的文件)|--WS(扩展名为.WSDL的文件)|--XMLSamples(扩展名为xml的文件,包含soap消息)如果我弄错了,很抱歉,但我的想法是在get xml请求的正文之后立即使用xsd get分支生成c#类,并在反序列化程序之后更正c#类,然后再进行一些反射。我尝试了一种、两种和多种方法,但我甚至不能承认我是xml方面的新手。
not expected "<Availability .."
XmlSerializer s1 = new XmlSerializer(typeof(Carlos.Envelope));
Envelope envelope = null;
using(var reader= System.IO.File.OpenText("SampleMessage.xml"))
{
envelope = (Envelope) s1.Deserialize(reader);
}