如何反序列化只是一个元素的肥皂响应?
所以之后我得到我的反应怎么办?(凡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
为一个字符串或反序列化为一个对象,当我有多个元素不仅仅是一个根元素。当有更多成员的根元素时,我想我已经明白了。
为了解决这个问题,你需要创建一个默认命名空间序列化:
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;
}
您可以在上面的链接阅读更多。
太棒了。我看到的唯一问题是我现在在序列化程序中指定了命名空间。有没有办法将它返回到一个对象。这只是一个字符串,所以我不知道如何指定我的根元素也是我的成员。 – Pittfall
你可以用上面写的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);
您需要从结果SOAP信封中删除命名空间。如果你写了这个服务,你可以添加[WebService(Namespace =“”)]我想! – Wheels73
我没有写。 – Pittfall
看看XmlSerializerNamespaces。我想你可以通过串行器的XML设置传递一个并将其删除。如果你失败了,那么当你添加Web服务时你应该有一个引用类型。找到包含该字符串的响应类型,你可以在那里删除它。 – Wheels73