【问题标题】:XmlSerializer - Deserialize SoapException Detail ElementXmlSerializer - 反序列化 SoapException 详细信息元素
【发布时间】:2011-01-04 19:08:26
【问题描述】:

我正在尝试反序列化从 Web 服务接收到的 SoapException 消息。 我收到以下异常:

System.InvalidOperationException was unhandled
  Message="There is an error in XML document (2, 2)."
  Source="System.Xml"
  StackTrace:
       at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
       at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader)
       at FullServiceServices.AddressCorrectionService.GetResponse(FullServiceAddressCorrectionQueryRequest request) in AddressCorrectionService.cs:line 169
       at FullServiceServices.AddressCorrectionService.GenerateRequest(DateTime startDate, DateTime endDate) in AddressCorrectionService.cs:line 79
       at FullServiceServices.Form1.Form1_Load(Object sender, EventArgs e) in \Form1.cs:line 33

  InnerException: System.InvalidOperationException
       Message="<Fault xmlns='http://idealliance.org/maildat/Specs/md091/mailxml81/mailxml'> was not expected."
       Source="gn4ggxxc"
       StackTrace:
            at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderFault.Read3_Fault()

我怎样才能正确地将这个 XML 反序列化为提供的部分类故障?


下面是我如何将 XML 字符串读入 XMLSerializer:

            XmlTextReader xr = new XmlTextReader(new StringReader(soapEx.Detail.FirstChild.InnerText));
            XmlSerializer xs = new XmlSerializer(typeof(Fault));
            Fault fault = xs.Deserialize(xr) as Fault;

这里是soap异常.Detail属性的FirstChild的InnerText

<?xml version="1.0" encoding="UTF-8"?>
<mailxml:Fault xmlns:mailxml="http://idealliance.org/maildat/Specs/md091/mailxml81/mailxml" xmlns:mailxml_base="http://idealliance.org/maildat/Specs/md091/mailxml81/base" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://idealliance.org/maildat/Specs/md091/mailxml81/mailxml mailxml_031910.xsd http://idealliance.org/maildat/Specs/md091/mailxml81/base mailxml_base_031910.xsd">
  <mailxml:FaultCode>402</mailxml:FaultCode>
  <mailxml:FaultDescription>402 Not Well Formed XML</mailxml:FaultDescription>
</mailxml:Fault>

这是通过 WSDL 自动生成的部分类。

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3082")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://idealliance.org/maildat/Specs/md091/mailxml81/mailxml")]
public partial class Fault {

    private string[] faultCodeField;

    private string[] faultDescriptionField;

    private string trackingIDField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("FaultCode")]
    public string[] FaultCode {
        get {
            return this.faultCodeField;
        }
        set {
            this.faultCodeField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("FaultDescription")]
    public string[] FaultDescription {
        get {
            return this.faultDescriptionField;
        }
        set {
            this.faultDescriptionField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(Form=System.Xml.Schema.XmlSchemaForm.Qualified)]
    public string TrackingID {
        get {
            return this.trackingIDField;
        }
        set {
            this.trackingIDField = value;
        }
    }
}

谢谢!

【问题讨论】:

  • 它是一个部分类的事实是无关的,顺便说一句

标签: c# web-services soap


【解决方案1】:

在 RootElement 上设置命名空间就可以了

XmlRootAttribute xRoot = new XmlRootAttribute();
xRoot.Namespace = "http://namespacehere";

XmlReader xr = soapEx.Detail.FirstChild.CreateNavigator().ReadSubtree();
XmlSerializer xs = new XmlSerializer(typeof(Fault), xRoot);

Fault fault = xs.Deserialize(xr) as Fault;

【讨论】:

  • 老兄!在尝试将我的舌头缠绕在扁桃体上 3 小时后,这救了我的培根……
【解决方案2】:

首先,除非您别无选择,否则不要使用new XmlTextReader()。自 .NET 2.0 起已弃用。

其次,您已经有了 XML - 为什么将其转换为字符串然后再转换回 XML?试试

XmlReader xr = soapex.Detail.FirstChild.CreateNavigator().ReadSubTree();
Fault fault = xs.Deserialize(xr) as Fault;    

【讨论】:

  • 我收到同样的异常:“ 不是预期的。”
  • @Michael:这与您发布的 XML 不同。请注意,最后一个是 usps.com。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多