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ノード、2 番目servizioのノードの 2 番目の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 に答える