1

このタイトルは紛らわしいかもしれません。

linq で xml を読んでいるときに、非常に奇妙な問題が発生しました。

私のXMLはどういうわけか次のようになっています:

<Result>
  <Hotels>    
    <Hotel>
      <Documents>
        <Image>
          <Url>http://www.someUrlToImage1</Url>
        </Image>
        <Image>
          <Url>http://www.someUrlToImage2</Url>
        </Image>
      </Documents>
      <Room>
        <Documents>
          <Image>
            <Url>http://www.someUrlToImage3</Url>
          </Image>
          <Image>
            <Url>http://www.someUrlToImage4</Url>
          </Image>
        </Documents>
       </Room>
    </Hotel>
  <Hotels>
<Result>

ホテルに関する2つの画像を取得したい場合は、4つの画像すべてを取得します...:

Hotel temp = (from x in  doc.Descendants("Result").Descendants("Hotels").Descendants("Hotel")
             select new Hotel()

             HotelImages= new Collection<string>(
             x.Descendants("Documents").SelectMany(
               documents => documents.Descendants("Images").Select(
                document => (string)document.Descendants("URL").FirstOrDefault() ?? "")).ToList())

             }).First();

誰かが私の前にこの問題を抱えていることを願っています。

4

2 に答える 2

4

Descendants親要素のすぐ下だけでなく、親要素内のすべての一致する要素を返しますには 2 つの子孫タグがあり、両方から画像を取得しています。xDocuments

Elementsの代わりに使ってみてくださいDescendants

于 2013-03-15T15:36:42.727 に答える
1

Descendants()直接の子だけでなく、現在のノードの子孫を選択するため、最初のノードだけでなくx.Descendants("Documents")両方のノードが選択されます。Documents

これはどのように:

Hotel temp = (from x in  doc.Descendants("Hotel")
              select new Hotel()
              {
                HotelImages = new Collection<string>(
                                  x.Elements("Documents")
                                   .Descendants("Images")
                                   .Where(i => (string)i.Attribute("Class") == "jpg")
                                   .Select(img => (string)img.Element("URL") ?? "")
                                   .ToList()
                              )
              }).First();
于 2013-03-15T15:39:01.183 に答える