帮助使用嵌套元素从xml数据中创建对象

时间:2011-03-13 08:36:59

标签: c# .net linq linq-to-xml

我有这个xml:

<stop>
<code>2222222</code>
<code_short>E2217</code_short>
<name_fi>Konemies</name_fi>
<name_sv>Maskinbyggaren</name_sv>
<city_fi>Espoo</city_fi>
<city_sv>Esbo</city_sv>
<lines>
  <node>2010  1:Puolarmetsä</node>
  <node>2010K 1:Puolarmetsä</node>
  <node>2052  2:Hämevaara</node>
  <node>2103  1:Pohjois-Tapiola</node>
  <node>2103T 1:Pohjois-Tapiola</node>
  <node>2506  1:Pohjois-Tapiola</node>
  <node>2512A 2:Malmin asema</node>
  <node>2550  2:Itäkeskus, lait. 22</node>
  <node>5510  2:Vantaankoski</node>
</lines> </stop>

我想要的是使用LINQ创建一个List

止损是:

public class Stop
{
    public string code { get; set; }
    public string shortCode { get; set; }
    public string name { get; set; }
    public string city { get; set; }

    public IList<string> lines { get; set; }

    public Stop()
    {
        lines = new List<string>();
    }
}

如何使用LINQ实现此目的?

这个LINQ给了我一个停止列表

        XDocument xdoc = XDocument.Load("test.xml");

        var stop = (from node in xdoc.Element("response").Elements("node")
                    select new Stop
                    {
                        code = node.Element("code").Value,
                        shortCode = node.Element("code_short").Value,
                        name = node.Element("name").Value,
                        city = node.Element("city").Value
                    });

但我如何处理这些线?想法?建议?

1 个答案:

答案 0 :(得分:2)

这样的事情:

XDocument xdoc = XDocument.Load("test.xml");

var stop = (from node in xdoc.Descendants("stop")
            select new Stop
            {
                code = node.Attribute("code").Value,
                shortCode = node.Attribute("code_short").Value,
                name = node.Attribute("name").Value,
                city = node.Attribute("city").Value,
                lines = node.Element("lines")
                            .Elements("node")
                            .Select(x => (string) x)
                            .ToList()
            });

上面的代码还演示了一种将XElement转换为字符串的替代方法 - 使用强制转换而不是.Value属性。如果XElement为null,则转换的结果将为null,而.Value的结果将为异常。如果它对于缺少元素有效,则使用.Value是好的,因为一旦检测到错误数据就会导致错误;对于“可选”元素,强制转换是一种容忍缺失值的简单方法。