C#:我可以让XmlSerializer在没有命名空间定义的情况下反序列化XML文件吗?

时间:2014-09-02 02:10:11

标签: c# xml-namespaces xml-deserialization

我希望有人能帮助我。

我需要从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反序列化?

非常感谢任何帮助。

2 个答案:

答案 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。