我有这个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
});
但我如何处理这些线?想法?建议?
答案 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
是好的,因为一旦检测到错误数据就会导致错误;对于“可选”元素,强制转换是一种容忍缺失值的简单方法。