将难以形成的XML反序列化为C#对象
我拥有由第三方web服务以以下形式返回的XML:将难以形成的XML反序列化为C#对象,c#,xml,serialization,C#,Xml,Serialization,我拥有由第三方web服务以以下形式返回的XML: <object> <list name="subscriptions"> <object> <string name="id">something</string> <string name="title">something else</string> <l
<object>
<list name="subscriptions">
<object>
<string name="id">something</string>
<string name="title">something else</string>
<list name="categories" />
<number name="timestamp">1252707770116</number>
</object>
...more 'object'...
</list>
</object>
我正在尝试使用以下代码反序列化此文件:
XmlSerializer s = new XmlSerializer(typeof(ListOfSubscriptions));
StreamReader r = new StreamReader("out.xml");
ListOfSubscriptions listSubscribe = (ListOfSubscriptions)s.Deserialize(r);
r.Close();
但是,当它完成时,listSubscribe
有一个成员,其所有字段都为空
我应该如何创建反序列化模板
谢谢
更新-2010/01/28
感谢大家的评论,我将我的课程修改为:
[XmlRoot("object")]
public class ListOfSubscriptions
{
[XmlElement("list")]
public SubscriptionList[] items;
}
[XmlRoot("list")]
public class SubscriptionList
{
[XmlElement("object")]
public Subscription[] items;
}
[XmlRoot("object")]
public class Subscription
{
[XmlElement("string")]
public string id;
[XmlElement("string")]
public string title;
[XmlElement("list")]
public string[] categories;
[XmlElement("number")]
public string timestamp;
}
如果我注释掉订阅中的[XmlElement(…)]行并运行,我会得到listSubscribe
有一个SubscriptionList
项,该项具有正确的订阅数,但是,订阅的所有元素都为空
如果取消对XmlElement行的注释,则会得到一个反映订阅的错误。我想它会变得混乱,因为有多个元素具有相同的名称
如何将属性名绑定到类成员?您的思路是正确的。但是,您只定义了两个类。实际上有三个类需要定义:
另一个问题是将订阅字段定义为属性。它们不是属性,它们是元素。您将需要更改并删除它们 这就是一个例子。它应该是这样的:
[XmlArray("FullNames")]
[XmlArrayItem("Name")]
public string[] Names{get;set;}
<string name="id">something</string>
我会给你
<FullNames>
<Name>Michael Jackson</Name>
<Name>Paris Hilton</Name>
</FullNames>
迈克尔杰克逊
帕丽斯希尔顿酒店
使用这样的XML,您永远不会有任何收获:
[XmlArray("FullNames")]
[XmlArrayItem("Name")]
public string[] Names{get;set;}
<string name="id">something</string>
什么
这是由不懂XML的人创建的。等价物:
<id>something</id>
什么
将很容易反序列化
我能想到的唯一反序列化方法是在类上实现
IXmlSerializable
接口。我相信您可以使用XSD.exe.Net framework实用程序生成一个类,该类可用于XML文档的内存表示。谢谢,这让我离您更近了,我在将数据导入订阅对象时仍然存在问题,我在原始帖子中添加了详细信息。我将继续接受这个答案,它让我得到了最接近的答案。我发现我可以用Json获取数据,所以我使用Json.NET库来解决反序列化问题。谢谢。我同意,XML很容易反序列化,但是我收到的XML来自谷歌,你会认为他们会更清楚。@Aaron:不,我想他们不会考虑那些想要反序列化为对象的人。他们可能希望您直接处理XML,我在想XML有什么不对的地方。很高兴知道不仅仅是我。XSD没有提供任何可用的东西,我认为这是由于XML的形式