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

标签 c# xml serialization

我有由第三方 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>

我在尝试将此数据反序列化为对象时遇到很多问题。我无法使用 xsd.exe 生成架构,因此我手动生成了以下类来尝试适应此数据:

[XmlRoot("object")]
public class ListOfSubscriptions
{
    [XmlElement("list")]
    public Subscription[] items;
}

[XmlRoot("object")]
public class Subscription
{
    [XmlAttribute()]
    public string id;
    [XmlAttribute()]
    public string title;
    [XmlAttribute()]
    public string[] categories;
    [XmlAttribute()]
    public string timestamp;
}

我正在尝试使用以下代码反序列化它:

XmlSerializer s = new XmlSerializer(typeof(ListOfSubscriptions));
StreamReader r = new StreamReader("out.xml");
ListOfSubscriptions listSubscribe = (ListOfSubscriptions)s.Deserialize(r);
r.Close();

但是,当它完成时,listSubscribe 有一个成员,并且其所有字段都为空。

我应该如何创建反序列化模板?

谢谢

更新 - 2010/01/28

感谢大家的评论,我已将类(class)修改为以下内容:

[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 项目但是,订阅的所有元素均为 null。

如果我取消注释 XmlElement 行,则会收到反射(reflect)订阅的错误。我想它会变得困惑,因为有多个同名元素。

如何将属性名称与类成员联系起来?

最佳答案

你走在正确的道路上。但是,您只定义了两个类。实际上需要定义三个类:

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

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

关于c# - 将难以形成的 XML 反序列化为 C# 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2152182/

相关文章:

java - 在序列化过程中更改一些对象字段名称

php - Magento session 在哪里序列化?

c# - VM 上的 Azure Key Vault 访问引发 OAuth 异常 : The ClientId option must be provided

c# - 错误 : `Could not find file ' C:\Program Files (x86)\IIS Express\button. png'`

javascript - 如何: Dynamically move Google Gauge?

c# - 从自定义序列化类调用原始反序列化方法?

c++ - C/C++ 中 union 数组的序列化/反序列化

c# - 如何在 Roslyn ( Microsoft.CodeAnalysis ) 中向生成的方法添加参数? - 需要准确的语法

c# - C#获取外部进程的线程起始地址

android - 如何在 android 布局中使用多个 MathJax 公式 View