行。我正在尝试与Pivotal Tracker API进行通信,该API仅返回XML格式的数据。我有以下XML,我正在尝试反序列化到我的域模型中。
<?xml version="1.0" encoding="UTF-8"?>
<stories type="array" count="2" total="2">
<story>
<id type="integer">2909137</id>
<project_id type="integer">68153</project_id>
<story_type>bug</story_type>
<url>http://www.pivotaltracker.com/story/show/2909137</url>
<current_state>unscheduled</current_state>
<description></description>
<name>Test #2</name>
<requested_by>Anthony Shaw</requested_by>
<created_at type="datetime">2010/03/23 20:05:58 EDT</created_at>
<updated_at type="datetime">2010/03/23 20:05:58 EDT</updated_at>
</story>
<story>
<id type="integer">2909135</id>
<project_id type="integer">68153</project_id>
<story_type>feature</story_type>
<url>http://www.pivotaltracker.com/story/show/2909135</url>
<estimate type="integer">-1</estimate>
<current_state>unscheduled</current_state>
<description></description>
<name>Test #1</name>
<requested_by>Anthony Shaw</requested_by>
<created_at type="datetime">2010/03/23 20:05:53 EDT</created_at>
<updated_at type="datetime">2010/03/23 20:05:53 EDT</updated_at>
</story>
</stories>
我的'故事'对象创建如下:
public class story
{
public int id { get; set; }
public int estimate { get; set; }
public int project_id { get; set; }
public string story_type { get; set; }
public string url { get; set; }
public string current_state { get; set; }
public string description { get; set; }
public string name { get; set; }
public string requested_by { get; set; }
public string labels { get; set; }
public string lighthouse_id { get; set; }
public string lighthouse_url { get; set; }
public string owned_by { get; set; }
public string accepted_at { get; set; }
public string created_at { get; set; }
public attachment[] attachments { get; set; }
public note[] notes { get; set; }
}
当我执行反序列化代码时,我收到以下异常:
Exception:
There is an error in XML document (2, 2).
Inner Exception:
<stories xmlns=''> was not expected.
我可以将各个故事反序列化,我只是不能将这个xml反序列化为一个'故事'对象数组
我的反序列化代码(值是xml的字符串)
var byteArray = Encoding.ASCII.GetBytes(value);
var stream = new MemoryStream(byteArray);
var deserializedObject = new XmlSerializer(typeof (story[])).Deserialize(stream)
有人有什么想法吗?
答案 0 :(得分:9)
让我提供一个更简洁的解决方案。将反序列化设置为如下所示:
var deserializedObject = new XmlSerializer(typeof(story[]), new XmlRootAttribute("stories")).Deserialize(stream);
通过在XmlSerializer中指定第二个参数,可以避免必须删除该类。它让序列化器知道根元素的名称是什么。
为此,表示数组元素类型的类的名称必须与XML名称完全匹配,例如: class story {}
,<story>
。您可以通过指定XmlType来解决这个问题(我建议将其作为最佳实践):
[XmlType("story")]
public class Story
{
...
}
我更喜欢这样做,因为它让我无法使用XML类型名称。
答案 1 :(得分:4)
问题是你没有名为“故事”的属性。 XML Serializer在看到stories
元素时不知道如何处理它。
您可以尝试的一件事是创建一个“故事”类:
public class stories : List<story> {}
并使用
var byteArray = Encoding.ASCII.GetBytes(value);
stories deserializedObject = null;
using (var stream = new MemoryStream(byteArray))
{
var storiesSerializer = new XmlSerializer(typeof (stories));
deserializedObject = (stories)storiesSerializer .Deserialize(stream);
}
答案 2 :(得分:2)
尝试类似
的内容public class stories
{
[XmlElement("story")]
public story[] storyarray { get; set; }
}
...
var byteArray = Encoding.ASCII.GetBytes(value);
XmlSerializer serializer = new XmlSerializer(typeof(stories));
stories myStories = null;
using (var stream = new MemoryStream(byteArray))
{
myStories = (stories)serializer.Deserialize(stream);
}
foreach (story stor in myStories.storyarray)
Console.WriteLine(stor.story_type);
编辑:根据反馈使用语句更新代码示例。
答案 3 :(得分:1)
XMSerializer需要一个用于理解XML的XML命名空间。
xmlns="http://schemas.microsoft.com"
......应该这样做。请参阅this页面底部的XML示例。
答案 4 :(得分:0)
我建议您从Web服务获取的一些示例XML生成XSD。然后,使用该XSD,您可以生成具有所有正确序列化属性的类。