如何反序列化只是一个元素的肥皂响应?

问题描述:

所以之后我得到我的反应怎么办?(凡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

为了解决这个问题,你需要创建一个默认命名空间序列化:
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的结构。这是你的意思?或者你想反序列化一个未知结构的对象? –

由于您拥有一个根级别的数组,因此您的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);