【问题标题】:How do I deserialize a soap response that is just one element?如何反序列化只是一个元素的肥皂响应?
【发布时间】:2017-06-14 19:35:27
【问题描述】:

所以在我收到回复后我会这样做(在这种情况下,Tstring):

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 时,我得到了一个例外。 &lt;string xmlns='http://tempuri.org/'&gt; was not expected. 作为内部异常,There is an error in XML document (2, 2). 作为消息。

我正在尝试将Hello World 反序列化为字符串或反序列化为一个对象,当我有多个元素且不仅仅是一个根元素时。当存在具有更多成员的根元素时,我想我已经弄清楚了。

【问题讨论】:

  • 您需要从结果 SOAP 信封中删除命名空间。如果你写的服务,你可以添加 [WebService(Namespace = "")] 我认为!
  • 不是我写的。
  • 看看 XmlSerializerNamespaces。我认为您可以将一个作为 XML 设置传递给序列化程序并将其删除。失败了.. 添加 Web 服务时应该有一个引用类型.. 找到包含字符串的响应类型,您可能可以将其删除。

标签: c# xml soap httpclient


【解决方案1】:

为了解决此问题,您需要使用默认命名空间创建序列化程序:

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


您可以在下面的链接中阅读更多内容:
https://msdn.microsoft.com/en-us/library/aa302290.aspx

例如,如果您使用自定义类,您可以为 XmlSerialier 定义特定的类名

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

您可以在上面的链接中阅读更多信息。

【讨论】:

  • 太好了。我看到的唯一问题是我现在在序列化程序中指定命名空间。有没有办法将它返回到一个对象中。它只是一个字符串,所以我不知道如何指定我的根元素也是我的成员。
  • 你可以用我上面写的 [XmlRoot( Namespace="urn:my-namespace" )] 创建你自己的类,这样你就可以指定序列化的结构。这是你的意思吗?或者你想反序列化一个结构未知的对象?
【解决方案2】:

你的 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);

【讨论】:

    猜你喜欢
    • 2018-07-17
    • 1970-01-01
    • 2020-01-11
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2016-09-10
    相关资源
    最近更新 更多