将XML WebResponse转换为通用对象

问题描述 投票:2回答:2

我需要将XML响应解析为不同的类对象。我有许多不同属性的课程。我知道我可以使用LINQ直接创建对象,如下面的代码:

XElement response = XElement.Parse(xmlValue);
IEnumerable<DTO> result =
    from el in response.Descendants("i")
    select new DTO()
    {
        Object_ID = (int)el.Attribute("Object_ID")
        // Other properties mapped here.
    };

我的XML是以下格式,只有属性值,没有元素值:

<root>
    <i attribute1="value" attribute2="value"... attributex="value"/>
    <i attribute1="value" attribute2="value"... attributex="value"/>
    <i attribute1="value" attribute2="value"... attributex="value"/>
    <i attribute1="value" attribute2="value"... attributex="value"/>
</root>

问题是我有多个DTO,我不想为每个案例编写不同的处理程序,因为有很多不同的属性,映射每个属性会导致冗余的丑陋代码。

我需要将数据存储在IEnumerable类型中。

这是最有效的方法吗?我应该创建一个返回对象的泛型类型转换方法吗?

编辑:我最终使用XmlSerializer来解决这个问题,对下面接受的答案进行了一些小的调整。代码如下:

    public static IEnumerable<T> DeserializeXml<T>(XElement response)
    {
        var list = new List<T>();
        foreach (var item in response.Descendants("i"))
        {
            using (var sr = new StringReader(student.ToString()))
            {
                var xRoot = new XmlRootAttribute();
                xRoot.ElementName = "i";
                xRoot.IsNullable = true;
                var serializer = new XmlSerializer(typeof(T), xRoot);
                list.Add((T)serializer.Deserialize(sr));
            }
        }
        return list;
    }
c# xml linq generics
2个回答
1
投票

如果你想要更强类型的东西(比字符串的字典),在声明的属性名称和类型方面,你可以创建一个用XmlSerizalizer属性注释的DTO并使用通用数组反序列化器。

[XmlType("i")]
public class DtoI
{
    [XmlAttribute("Object_ID")]
    public int Id;
    [XmlAttribute("attribute1")]
    public String Attribute1;
    [XmlAttribute("attribute2")]
    public String Attribute2;
    [XmlAttribute("attributex")]
    public Int32 AttributeX;
}


public static T[] DeserializeArray<T>(String xml)
{
    using (var reader = new StringReader(xml))
    {
        var serializer = new XmlSerializer(typeof(T[]), new XmlRootAttribute("root"));
        return (T[])serializer.Deserialize(reader);
    }
}

1
投票

我可以为你的Xml中的每个i标签做一个属性字典,然后返回一个字典集合。

IEnumerable<Dictionary<string, string>> result =
    from tag in response.Descendants("i")
    select tag.Attributes().Select(a =>
        new { key = a.Name.LocalName, value = a.Value.ToString() })
        .ToDictionary(k => k.key, v => v.value);
© www.soinside.com 2019 - 2024. All rights reserved.