c# - xml反序列化的问题
问题描述
我在反序列化时遇到错误。它说xml文档中的错误。
public T XmlDeserialiseResponseObject<T>(string xml)
{
T returnedXmlClass;
try
{
xml = XmlResponseObjectCleaner(xml);
var doc = new XmlDocument();
doc.LoadXml(xml);
var reader = new XmlNodeReader(doc.DocumentElement);
var ser = new XmlSerializer(typeof(T));
returnedXmlClass = (T)ser.Deserialize(reader);
}
catch (Exception ex)
{
throw ex;
}
return returnedXmlClass;
}
我的 XML:
<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/elope/'><soap:Body><GetBenefitStatusFault xmlns:ns2='http://schemas.somesite.co.za/somesite/some/' schemaVersion='1.0'>
<ErrorCode>3513</ErrorCode>
<ErrorMessage>Membership details not valid: Match on initial not found</ErrorMessage>
</GetBenefitStatusFault></soap:Body></soap:Envelope>
XmlResponseObjectCleaner:
private string XmlResponseObjectCleaner(string xml)
{
var sb = new StringBuilder();
sb.Append(xml);
sb.Replace(@"""", "'");
sb.Replace("<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'>", "");
sb.Replace("</env:Envelope>", "");
sb.Replace("<env:Header/>", "");
sb.Replace("<env:Body>", "");
sb.Replace("ns3:", "");
sb.Replace("ns2:", "");
sb.Replace("</env:Body>", "");
sb.Replace("env", "");
sb.Replace("T00:00:00.000+02:00", "");
sb.Replace("T00:00:00.000Z", "");
return sb.ToString();
}
解决方案
你可以:
- 将 XML 加载到 DOM 中并选择 Body 元素并从那里解析 OuterXml
- 从信封开始
这是2的方法:
使用 System.IO; 使用 System.Xml.Serialization; 静态类 P { 静态无效主要() { const string xml = @"<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/elope/'><soap:Body><GetBenefitStatusFault xmlns:ns2='http://schemas.somesite .co.za/somesite/some/' schemaVersion='1.0'> <错误代码>3513</错误代码> <ErrorMessage>成员详细信息无效:未找到初始匹配</ErrorMessage> </GetBenefitStatusFault></soap:Body></soap:Envelope>"; var obj = XmlDeserialiseResponseObject<GetBenefitBody>(xml); if (obj.GetBenefitStatusFault 是故障 f) { System.Console.WriteLine(f.ErrorCode); System.Console.WriteLine(f.ErrorMessage); } } 公共静态 T XmlDeserialiseResponseObject<T>(字符串 xml) { var ser = new XmlSerializer(typeof(Envelope<T>)); var obj = (Envelope<T>)ser.Deserialize(new StringReader(xml)); 返回 obj.Body; } } [XmlRoot("信封", 命名空间 = "http://schemas.xmlsoap.org/soap/elope/")] 公共类信封<T> { 公共 T 身体 { 得到; 放; } } 公共类 GetBenefitBody { [XmlElement(命名空间 = "")] 公共故障 GetBenefitStatusFault { get; 放; } } 公共类故障 { 公共 int 错误代码 { 获取;放; } 公共字符串错误消息 { 获取;放; } }
推荐阅读
- npm - 为什么 npm 会在我的项目根文件夹中安装一堆 .cmd 文件?
- visual-studio - 在项目选项中找不到跨平台应用程序 (Xamarin)
- javascript - div mouseenter() 或 hover()、delay()、fadeIn()、多个 div 条目在少于延迟时间 jQuery
- xcode - 无法在 Xcode 中构建:“代码对象在子组件中根本没有签名...... CocoaAsyncSocket.framework”
- spring - 构建 Spring 框架:为什么 IntelliJ 抱怨错误但编辑器似乎能够找到类?
- javascript - 跟踪复选框状态并为 ng-model 使用多个数据
- apache - mod_rewrite:由于可能的配置错误,请求超出了 10 个内部重定向的限制
- angular - Angular 2:未定义的路由参数值
- python - Square POS API - 可以从仪表板获取销售信息
- python - Python:你什么时候将变量放在函数内部或外部?