2014-11-01 82 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