如何将XML元素反序列化为具有未知元素名称的通用列表

时间:2014-04-30 09:26:42

标签: c# xml generics

我正在从数据库表列中检索并成功反序列化已知元素名称的xml字符串(这些不会更改),但也有一些嵌套的XML元素称为"其他属性"这并不总是会被人知道。我将这些未知元素名称反序列化为通用列表时遇到了一些麻烦,因此我可以在反序列化后以html格式显示它们。

XML如下:

<Detail>
<DetailAttributes>
<Name>Name_123</Name>
<Type>Type_123</Type>
</DetailAttributes>
<OtherAttributes>
<SummaryKey AttributeName="SummaryKey">SummaryKey_123</SummaryKey>
<Account AttributeName="Account">Account_123</Account>
</OtherAttributes>
</Detail>

我没有问题反序列化名称&#39;和&#39;键入&#39;元素和我可以反序排列&#39; SummaryKey&#39;和&#39;帐户&#39;元素,但只有当我明确指定他们的元素名称 - 这不是理想的方法,因为&#39; OtherAttributes&#39;可能会有变化。

我的课程如下:

[XmlRoot("Detail")]
public class objectDetailsList
{
    [XmlElement("DetailAttributes"), Type = typeof(DetailAttribute))]
    public DetailAttribute[] detailAttributes { get; set; }

    [XmlElement("OtherAttributes")]
    public List<OtherAttribute> otherAttributes { get; set; }

    public objectDetailsList()
    {
    }
}
[Serializable]
public class Detail Attribute
{
    [XmlElement("Type")]
    public string Type { get;set; }

    [XmlElement("Name")]
    public string Name { get;set; }

    public DetailAttribute()
    {
    }
}

[Serializable]
public class OtherAttribute
{
    //The following will deserialise ok

    //[XmlElement("SummaryKey")]
    //public string sumKey { get; set; }

    //[XmlElement("Account")]
    //public string acc { get; set; }

    //What I want to do below is create a list of all 'other attributes' without known names

    [XmlArray("OtherAttributes")]
    public List<Element> element { get; set; }
}

[XmlRoot("OtherAttributes")]
public class Element
{
    [XmlAttribute("AttributeName")]
    public string aName { get; set; }

    [XmlText]
    public string aValue { get; set; }
}

当我尝试检索OtherAttribute元素的反序列化列表时,计数为零,因此它无法访问嵌套在&#34;其他属性&#34;中的元素。

有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:3)

使用这样的具体类和动态数据,您无法依靠标准的XmlSerializer为您序列化/反序列化 - 因为它反映在您的类上,而您想要填充的属性只需要#&# 39; t存在。如果你的&#39; OtherAttributes&#39;你可以提供一个包含所有可能属性的类。已知且有限,并且不受未来变化的影响,但这会给你一个丑陋的臃肿课程(我认为你已经决定这不是解决方案)。

实际选择:

  • 手动执行。使用XmlDocument类,使用.Load()加载数据,并使用.selectNodes()使用XPath查询(类似于&#34; / Detail / OtherAttributes / *&#34;)来迭代节点。您将不得不自己编写批次,但这使您可以完全控制序列化/反序列化。您不必在(可以说是多余的!)属性中覆盖您的代码。

  • 使用Json.NET(http://james.newtonking.com/json),它可以更好地控制序列化和反序列化。它速度快,文档很好,而且整体上非常漂亮。