2017-06-14 39 views
0

所以之後我得到我的反應怎麼辦?(凡T在這種情況下string):如何反序列化只是一個元素的肥皂響應?

var theResult = response.Content.ReadAsStringAsync().Result; 
using (var stringreader = new StringReader(theResult)) 
{ 
    var serializer = new XmlSerializer(typeof(T)); 
    var responseObj = (T)serializer.Deserialize(stringreader); 
} 

theResult是:

<string xmlns="http://tempuri.org/">Hello World</string> 

當我做Desrialize我得到一個異常。作爲內部例外的是<string xmlns='http://tempuri.org/'> was not expected.,作爲消息的There is an error in XML document (2, 2).

我想反序列化爲Hello World爲一個字符串或反序列化爲一個對象,當我有多個元素不僅僅是一個根元素。當有更多成員的根元素時,我想我已經明白了。

+0

您需要從結果SOAP信封中刪除命名空間。如果你寫了這個服務,你可以添加[WebService(Namespace =「」)]我想! – Wheels73

+0

我沒有寫。 – Pittfall

+0

看看XmlSerializerNamespaces。我想你可以通過串行器的XML設置傳遞一個並將其刪除。如果你失敗了,那麼當你添加Web服務時你應該有一個引用類型。找到包含該字符串的響應類型,你可以在那裏刪除它。 – Wheels73

回答

1

爲了解決這個問題,你需要創建一個默認命名空間序列化:
https://msdn.microsoft.com/en-us/library/aa302290.aspx


var serializer = new XmlSerializer(typeof(T), "http://tempuri.org/"); 
var responseObj = (T)serializer.Deserialize(stringreader); 


您可以在下面的鏈接小有一點更多關於這個閱讀
例如,如果您使用custome類,則可以爲XmlSerialier定義特定的類名稱

[XmlRoot(Namespace="urn:my-namespace")] 
public class MyClass 
{ 
    public string MyField; 
} 

您可以在上面的鏈接閱讀更多。

+0

太棒了。我看到的唯一問題是我現在在序列化程序中指定了命名空間。有沒有辦法將它返回到一個對象。這只是一個字符串,所以我不知道如何指定我的根元素也是我的成員。 – Pittfall

+0

你可以用上面寫的XmlRoot屬性創建你自己的類[XmlRoot(Namespace =「urn:my-namespace」)],以這種方式指定serialize的結構。這是你的意思?或者你想反序列化一個未知結構的對象? –

0

由於您擁有一個根級別的數組,因此您的xml格式不好。你必須讓你的XML閱讀器允許片段。

  XmlSerializer xs = new XmlSerializer(typeof(AppConfig)); 
      XmlReaderSettings settings = new XmlReaderSettings(); 
      settings.ConformanceLevel = ConformanceLevel.Fragment; 
      XmlReader reader = XmlReader.Create(filepath); 
      AppConfig configData = (AppConfig)xs.Deserialize(reader);