在C#中使用Linq从Xelement List迭代到XML时,不会返回最后一个节点
本文关键字:XML 节点 最后一个 返回 迭代 Linq List Xelement | 更新日期: 2023-09-27 17:59:30
我正试图使用linq从XML文件中获取值到XML,除了最后一个节点外,所有节点都将返回。例如这里的样本数据
<lista>
- <servizio>
<idservizio>29</idservizio>
<idfascia>0</idfascia>
<nomeservizio>Shuttle service/ Taxi - Fiumicino Airport a Hotel</nomeservizio>
- <descrizioneservizio>
- <![CDATA[ From Fiumicino (FCO) Airport to City Guest House Hotel. Up to 3 people.
]]>
</descrizioneservizio>
<prezzoservizio>50.0</prezzoservizio>
<numerodisponibile>1000</numerodisponibile>
</servizio>
- <servizio>
<idservizio>30</idservizio>
<idfascia>0</idfascia>
<nomeservizio>Shuttle service/ Taxi - Ciampino a Hotel</nomeservizio>
- <descrizioneservizio>
- <![CDATA[ From Ciampino Airport to City Guest House Hotel. Price for up to 3 people.
]]>
</descrizioneservizio>
<prezzoservizio>35.0</prezzoservizio>
<numerodisponibile>1000</numerodisponibile>
</servizio>
</lista>
并且不返回idservizio=30的节点servizio。有人能帮我做错事吗?下面是我的代码
var ds1 = from XElement e in _resource.Descendants("lista")
select e;
int eCnt = 0;
foreach (XElement e in ds1)
{
XElement elm;
elm = e.Elements("servizio").ElementAt(eCnt).Descendants("idservizio").FirstOrDefault();
int idservice = elm != null ? elm.Value.ToInt32() : 0;
if (idservice == 0) continue;
//HH_dispService service = listService.SingleOrDefault(x => x.service_idservizio == idservice);
HH_dispService service = new HH_dispService(idservice);
elm = e.Elements("servizio").ElementAt(eCnt).Descendants("nomeservizio").FirstOrDefault();
service.service_nomeservizio = elm != null ? elm.Value : "";
elm = e.Elements("servizio").ElementAt(eCnt).Descendants("descrizioneservizio").FirstOrDefault();
service.service_descrizioneservizio = elm != null ? elm.Value : "";
elm = e.Elements("servizio").ElementAt(eCnt).Descendants("prezzoservizio").FirstOrDefault();
service.service_prezzoservizio = elm != null ? elm.Value.Replace(".", ",").objToDecimal() : 0;
listService.Add(service);
eCnt++;
}
您的代码当前正在每个lista
元素上循环。。。但是随后使用索引作为到达CCD_ 2元素的方式。这是一种非常奇怪的做事方式。看起来您也在以一种奇怪的方式转换为decimal
。
我会这么做:
foreach (var element in _resource.Descendants("lista").Elements("servizio"))
{
// Consider *only* skipping if the element is missing, not
// if it has a value of 0
int id = (int?) element.Element("idservizio") ?? 0;
if (id == 0)
{
continue;
}
HH_dispService service = new HH_dispService(id);
service.service_nomeservizio =
(string) element.Element("nomeservizio") ?? "";
service.service_descrizioneservizio =
(string) element.Element("descrizioneservizio") ?? "";
service.service_prezzoservizio =
(decimal?) element.Element("prezzoservizio") ?? 0m;
listService.Add(service);
}
(我还建议更改您的变量/属性名称……为什么您希望在本质上与service
有关的类型中的变量上使用service_
前缀?)
那个代码真的很奇怪。
在lista
的列表上进行迭代,但访问子节点servizio
。结果应该是第一lista
节点的第一servizio
节点、第二lista
节点的第二servizio
节点,依此类推
我会这样做(假设lista
不是根标签):
var listaNodes = _resource.Descendants("lista");
foreach(var listaNode in listaNodes)
{
foreach(var serviceNode in listaNode.Elements("servizio"))
{
var id = serviceNode.Element("idservizio");
// ...
}
}