2014-11-01 120 views
1

我有这样的XML:DataContract反序列化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. 

ResultData:

[DataContract] 
public class ResultData 
{ 

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

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

} 
+0

显示你的代码并定义“不起作用”,否则你很可能无法得到帮助是零。我们不是clairvoyants .... – Tim 2014-11-01 09:15:12

+0

我编辑了我的问题。谢谢。 – dillci 2014-11-01 14:56:47

+1

@dillci Again ... ResultData类在哪里? – Aron 2014-11-01 15:42:18

回答

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); 
+0

非常感谢!从我尝试的所有事情中,这是最好的方式。 :) – dillci 2014-11-03 09:16:35

+0

我用完全你的代码,它运行完美。 – dillci 2014-11-03 09:19:00