【问题标题】:DataContract deserialize XMLDataContract 反序列化 XML
【发布时间】:2014-11-01 09:09:57
【问题描述】:

我有这个 XML:

<ResultData xmlns="http://schemas.datacontract.org/2004/07/TsmApi.Logic.BusinesEntities" 
            xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Information>Schedule added.</Information>
  <Success>true</Success>
</ResultData>

有没有办法得到结果:

<ResultData>
  <Information>Sched added.</Information>
  <Success>true</Success>
</ResultData>

没有以下示例中的所有其他内容? 因为当我尝试获取下面显示的结果字符串的对象时,它不起作用。

Datacontract XML serialization

我尝试使用的代码是:

var serializer = new XmlSerializer(typeof(ResultData)); 
var rdr = new StringReader(xmlResultString);
var resultingMessage = (ResultData)serializer.Deserialize(rdr);

最后一行显示错误:

An unhandled exception of type 'System.InvalidOperationException' occurred in System.Xml.dll

Additional information: There is an error in XML document (1, 2).

<ResultData xmlns='http://schemas.datacontract.org/2004/07/TsmApi.Logic.BusinesEntities'> was not expected.

结果数据:

[DataContract]
public class ResultData
{

    [DataMember] 
    public bool Success
    {
        get;
        set;
    }

    [DataMember] 
    public string Information
    {
        get;
        set;
    }

}

【问题讨论】:

  • 显示您的代码并定义“不起作用”,否则您可能无法获得帮助。我们不是千里眼……
  • 我编辑了我的问题。谢谢。
  • @dillci 再次...ResultData 类在哪里?
  • 我添加了 ResultData 类。

标签: c# xml wcf datacontractserializer xml-deserialization


【解决方案1】:

由于 xml 中的 DataContract 序列化命名空间,您会看到异常。理想情况下,您希望使用 DataContractSerializer 反序列化它。

如果您想使用 XmlSerializer,则必须清理命名空间声明。以下将清理所有命名空间并允许您使用 XmlSerializer。在 foreach 循环中,我们必须删除 IsNamespaceDeclaration 属性,然后将元素 Name 属性设置为 LocalName。

string xmlResultString = @"<ResultData xmlns=""http://schemas.datacontract.org/2004/07/TsmApi.Logic.BusinesEntities"" 
xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"">
<Information>Schedule added.</Information>
<Success>true</Success>
</ResultData>";

var doc = XDocument.Parse(xmlResultString);

foreach (var element in doc.Descendants())
{
    element.Attributes().Where(a => a.IsNamespaceDeclaration).Remove();
    element.Name = element.Name.LocalName;
}
xmlResultString = doc.ToString();
var rdr = new StringReader(xmlResultString);
var serializer = new XmlSerializer(typeof(ResultData));
var resultingMessage = (ResultData)serializer.Deserialize(rdr);

【讨论】:

  • 非常感谢!从我尝试过的所有事情来看,这是最好的方法。 :)
猜你喜欢
  • 2012-06-23
  • 1970-01-01
  • 2011-06-19
  • 2017-06-10
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多