将难以形成的XML反序列化为C#对象

将难以形成的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

我拥有由第三方web服务以以下形式返回的XML:

<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行的注释,则会得到一个反映订阅的错误。我想它会变得混乱,因为有多个元素具有相同的名称


如何将属性名绑定到类成员?

您的思路是正确的。但是,您只定义了两个类。实际上有三个类需要定义:

  • 单个根对象,XML名称为“object”。这将只有一名成员:
  • 对象列表(XML名称为“list”)。这将有一个成员,一个数组:
  • 订阅,XML名称为“object”

  • 另一个问题是将订阅字段定义为属性。它们不是属性,它们是元素。

    您将需要更改并删除它们

    这就是一个例子。它应该是这样的:

    [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的形式