从字符串中反序列化XML

50

我希望将从web服务获取的字符串结果转换为对象。

这是我从服务中获取的字符串:

<StatusDocumentItem><DataUrl/><LastUpdated>2013-01-31T15:28:13.2847259Z</LastUpdated><Message>The processing of this task has started</Message><State>1</State><StateName>Started</StateName></StatusDocumentItem>

所以我有一个类:

[XmlRoot]
public class StatusDocumentItem
{
    [XmlElement]
    public string DataUrl;
    [XmlElement]
    public string LastUpdated;
    [XmlElement]
    public string Message;
    [XmlElement]
    public int State;
    [XmlElement]
    public string StateName;
}

我正在尝试使用XMLDeserializer将该字符串作为StatusDocumentItem类型的对象获取(注意:operationXML包含该字符串):

string operationXML = webRequest.getJSON(args[1], args[2], pollURL);
var serializer = new XmlSerializer(typeof(StatusDocumentItem));
StatusDocumentItem result;

using (TextReader reader = new StringReader(operationXML))
{
    result = (StatusDocumentItem)serializer.Deserialize(reader);
}

Console.WriteLine(result.Message);

但是我的结果对象总是空的。我做错了什么吗?

更新。我从operationXML中获取的值像这样,并且有一个不必要的xmlns属性阻止了我的反序列化。没有那个属性,一切都正常。它看起来像这样:

"<StatusDocumentItem xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><DataUrl/><LastUpdated>2013-02-01T12:35:29.9517061Z</LastUpdated><Message>Job put in queue</Message><State>0</State><StateName>Waiting to be processed</StateName></StatusDocumentItem>"

1
"operationXML 包含字符串" - 是吗?你实际上用调试器检查过了吗?使用 "getJSON" 检索 XML 看起来有问题。 - Christian.K
1
如果您将XML示例设置为_operationXML_,反序列化将完美地工作。 - Cédric Bignon
1
@Pedram string operationXML = "<StatusDocumentItem><DataUrl/><LastUpdated>2013-01-31T15:28:13.2847259Z</LastUpdated><Message>The processing of this task has started</Message><State>1</State><StateName>Started</StateName></StatusDocumentItem>"; @Pedram _字符串 operationXML =“<StatusDocumentItem> <DataUrl/> <LastUpdated> 2013-01-31T15:28:13.2847259Z </LastUpdated> <Message>正在处理此任务</Message> <State> 1 </State> <StateName>已启动</StateName> </StatusDocumentItem>”; _ - Cédric Bignon
@Pedram 我的意思是,“webRequest.getJSON(args[1], args[2], pollURL);”不会返回你在帖子中写的XML字符串。 - Cédric Bignon
1
@Pedram 我们得到了 result.Message = "作业已放入队列" 的消息。 - Cédric Bignon
显示剩余8条评论
2个回答

135

试试这个:

string xml = "<StatusDocumentItem xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><DataUrl/><LastUpdated>2013-02-01T12:35:29.9517061Z</LastUpdated><Message>Job put in queue</Message><State>0</State><StateName>Waiting to be processed</StateName></StatusDocumentItem>";
var serializer = new XmlSerializer(typeof(StatusDocumentItem));
StatusDocumentItem result;

using (TextReader reader = new StringReader(xml))
{
    result = (StatusDocumentItem)serializer.Deserialize(reader);
}

Console.WriteLine(result.Message);
Console.ReadKey();

它是否显示“作业已放入队列”?


11

这个通用的扩展功能对我来说非常有效...

public static class XmlHelper
{
    public static T FromXml<T>(this string value)
    {
        using TextReader reader = new StringReader(value);
        return (T) new XmlSerializer(typeof(T)).Deserialize(reader);
    }
}

1
在我看来,最好的方法是这样做。 - Pedro Martín

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接