2014-02-17 84 views
0

我拥有XML,如下所示。将XML中的键值对反序列化为c#对象

<Device-array> 
    <Device> 
    <id>8</id> 
    <properties> 
    <PropKeyValuePair>...</PropKeyValuePair> 
    <PropKeyValuePair>...</PropKeyValuePair> 
    </properties> 
    </Device> 
    <Device>...</Device> 
    <Device>...</Device> 
</Device-array> 

我打算将其反序列化为C#对象,以便它会更快。我只需要id字段。但我明白,类需要有一个(属性)数组。但是,我如何表达关键价值对?

[Serializable()] 
public class SLVGeoZone 
{ 
    [XmlElement("id")] 
    public string id { get; set; } 

    //Arraylist of key value pairs here ? 

} 

需要suggetions。

+1

如果您只需要ID,你为什么加入keyvaluepairs到类?我非常确定,当您反序列化时,您不会引用的标记将被忽略。 – Blorgbeard

回答

1

您可以使用LINQ到XML的反序列化代替,让你需要的东西:ID列表:

var xDoc = XDocument.Load("FilePath.xml"); 

var ids = xDoc.Root 
       .Elements("Device") 
       .Select(x => (int)x.Element("id")) 
       .ToList(); 

如果你真的需要使用反序列化你可以忽略的属性,你不需要和XmlSerializer将反序列化刚刚声明的内容,跳过你没有在你的类中声明的元素。

更新

为了获得更多的则只是一个名称的匿名类型的列表:

var ids = xDoc.Root 
       .Elements("Device") 
       .Select(x => new { 
        Id = (int)x.Element("id"), 
        Name = (string)x.Element("name") 
       }) 
       .ToList(); 
+0

可以说我有500个设备阵列,我只需要在他们每个人身份证。在性能方面,LINQ是否更好? – user1687824

+0

我不知道。你必须测量它。它的可读性和易用性更强,因为您不必声明任何类并且代码非常简单。 – MarcinJuraszek

+0

好的。谢谢回复。假设还有一个元素“名称”。我可以从Linq查询中获得id和相应名称的列表吗? – user1687824