2

我正在尝试使用 linq to 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++;
        }
4

2 回答 2

1

您的代码当前正在遍历每个lista元素......但随后使用索引作为获取servizio元素的一种方式。这是一种非常奇怪的做事方式。看起来你也在以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_在本质上与 a 相关的类型中添加 on 变量的前缀service?)

于 2013-02-14T07:28:57.107 回答
0

那个代码真的很奇怪。

您遍历列表lista但访问子节点servizio。结果应该是第一个servizio节点的第一个lista节点,第二个servizio节点的第二个lista节点等等。

我会这样做(假设这lista不是根标签):

var listaNodes = _resource.Descendants("lista");
foreach(var listaNode in listaNodes)
{
    foreach(var serviceNode in listaNode.Elements("servizio"))
    {
        var id = serviceNode.Element("idservizio");
        // ...
    }
}
于 2013-02-14T07:30:17.710 回答