在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++;
        }

在C#中使用Linq从Xelement List迭代到XML时,不会返回最后一个节点

您的代码当前正在每个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");
        // ...
    }
}