从字符串反序列化的XML字符串、序列化、XML

2023-09-03 02:11:03 作者:残败之身

我想要的结果,我从我的web服务作为一个字符串得到转换,并将​​其转换为对象。

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

<StatusDocumentItem><DataUrl/><LastUpdated>2013-01-31T15:28:13.2847259Z</LastUpdated><Message>The这个任务的处理有started</Message><State>1</State><StateName>Started</StateName></StatusDocumentItem>

所以我有一个类此的:

  [XmlRoot]
公共类StatusDocumentItem
{
    [的XmlElement]
    公共字符串DataUrl;
    [的XmlElement]
    公共字符串LASTUPDATED;
    [的XmlElement]
    公共字符串信息;
    [的XmlElement]
    公众诠释状态;
    [的XmlElement]
    公共字符串Statename的;
}
 
C 反序列化XML异常 在 XML文档 0, 0 中有一个错误 缺少根元素

这也是为什么我试图让该字符串类型StatusDocumentItem与XMLDeserializer对象(NB operationXML包含字符串):

 字符串operationXML = webRequest.getJSON(参数[1]的args [2],pollURL);
无功序列化=新的XmlSerializer(typeof运算(StatusDocumentItem));
StatusDocumentItem结果;

使用(TextReader的读者=新StringReader(operationXML))
{
    结果=(StatusDocumentItem)serializer.Deserialize(读卡器);
}

Console.WriteLine(result.Message);
 

但我的结果对象始终是空的。我究竟做错了什么?

更新。我从我的operationXML获得的价值是这样的,并具有不必要的xmlns属性被挡住了我的反序列化。如果没有这个属性,一切工作正常。下面是它的样子:

 &LT; StatusDocumentItem xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><DataUrl/><LastUpdated>2013-02-01T12:35:29.9517061Z</LastUpdated><Message>Job放入队列&LT; /消息&GT;&LT;国家&GT; 0℃/国家&GT;&LT; Statename的&GT;等待处理&LT; / Statename的&GT;&LT; / StatusDocumentItem&gt;中
 

解决方案

试试这个:

  XML字符串=&LT; StatusDocumentItem xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><DataUrl/><LastUpdated>2013-02-01T12:35:29.9517061Z</LastUpdated><Message>Job放入队列&LT; /消息&GT;&LT;国家&GT; 0℃/国家&GT;&LT; Statename的&GT;等待处理&LT; / Statename的&GT;&LT; / StatusDocumentItem&gt;中;
无功序列化=新的XmlSerializer(typeof运算(StatusDocumentItem));
StatusDocumentItem结果;

使用(TextReader的读者=新StringReader(XML))
{
    结果=(StatusDocumentItem)serializer.Deserialize(读卡器);
}

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

这是否表明工作摆在排队?

I'm trying to convert the result I get from my web service as a string and convert it to an object.

This is the string I'm getting from my service:

<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>

So I have a class for this as:

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

And this is how I'm trying to get that string as an object of type StatusDocumentItem with XMLDeserializer (NB. operationXML contains the string):

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

But my result object is always empty. What am I doing wrong?

Update. The value I get from my operationXML is like this and has an unnecessary xmlns attribute that is blocking my deserialization. Without that attribute, everything is working fine. Here is how it looks like:

"<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>"

解决方案

Try this:

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();

Does it show "Job put in queue"?