我希望有人能帮助我。
我需要从XML序列化一个请求,以便将其转换为SOAP调用。问题是,当xml缺少xmlns定义时,我无法成功。
首先,我有一个名为GetRegistrationStatusRequest的类。这是使用客户提供的XSD中的XSD工具自动生成的。该类如下所示(请注意,我已替换了客户端敏感URL)
//
// This source code was auto-generated by xsd, Version=4.0.30319.18020.
//
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.18020")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://some.url/srvc/getregistrationstatus/v1_0/request/")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://some.url/srvc/getregistrationstatus/v1_0/request/", IsNullable=false)]
public partial class GetRegistrationStatusRequest : ServiceRequest {
... auto generated code
如上所述,这是自动生成的。我把它包括在内作为参考。
我实际反序列化Xml的代码如下:
XmlSerializer serializer = new XmlSerializer(typeof(GetRegistrationStatusRequest));
GetRegistrationStatusRequest request = (GetRegistrationStatusRequest)serializer.Deserialize(new StringReader(RequestXml.OuterXml));
如果我按如下方式使用XML,它可以正常工作:
<GetRegistrationStatusRequest xmlns="http://some.url//srvc/getregistrationstatus/v1_0/request/">
<PlateNo>PlateNo1</PlateNo>
</GetRegistrationStatusRequest>
然而,我收到的XML(这是我无法控制的)没有定义xmlns。相反它看起来像这样:
<GetRegistrationStatusRequest>
<PlateNo>PlateNo1</PlateNo>
</GetRegistrationStatusRequest>
当我尝试反序列化时,我收到消息&#34;这是XML文档中的一个错误(1,2)&#34;
我想知道实际上是否可以在不需要xmlns定义的情况下让Xml反序列化?
非常感谢任何帮助。
答案 0 :(得分:0)
好的,我在这里找到了解决方案,我希望它可以帮助其他有这个问题的人:
http://calvinirwin.net/2011/02/10/xmlserialization-deserialize-causes-xmlns-was-not-expected/
我的代码现在看起来像这样:
XmlRootAttribute xRoot = new XmlRootAttribute();
xRoot.ElementName = "GetRegistrationStatusRequest";
Root.IsNullable = true;
XmlSerializer serializer = new XmlSerializer(typeof(GetRegistrationStatusRequest), xRoot);
request = (GetRegistrationStatusRequest)serializer.Deserialize(new StringReader(RequestXml.OuterXml));
答案 1 :(得分:0)
我有同样的问题。最初,我尝试使用XmlTextReader(名称空间属性设置为false)。该代码在客户端应用程序中可以正常工作,但是在WCF服务(定义了相关类型)中使用时仍然遇到错误。
我发现的解决方案是使用XmlDocument对象,然后在反序列化之前更正xmlns属性:
string ns = "http://some.url/srvc/getregistrationstatus/v1_0/request/";
XmlDocument doc = new XmlDocument();
doc.LoadXml(RequestXml.OuterXml);
doc.DocumentElement.SetAttribute("xmlns", ns);
XmlSerializer ser = new XmlSerializer(typeof(GetRegistrationStatusRequest), ns);
using (StringReader sr = new StringReader(doc.InnerXml)) {
GetRegistrationStatusRequest req = (GetRegistrationStatusRequest)ser.Deserialize(sr);
}
还要注意使用using
来关闭和处理StringReader。