Linq to XML - странные результаты - PullRequest
0 голосов
/ 17 июня 2009

Я новичок в Linq и получаю странные результаты, когда пытаюсь выполнить запрос, используя where.

Пример xml:

    <movies>
      <movie id="1">
        <scenes>
          <scene id="1">
            <sceneartistsnames>
              <sceneartistname>Artist A</sceneartistname>
            </sceneartistsnames>
          </scene>
          <scene id="2">
            <sceneartistsnames>
              <sceneartistname>Artist B</sceneartistname>
            </sceneartistsnames>
          </scene>
        </scenes>
      </movie>
      <movie id="10">
        <scenes>
          <scene id="1">
            <sceneartistsnames>
              <sceneartistname>Artist B</sceneartistname>
              <sceneartistname>Artist A</sceneartistname>
            </sceneartistsnames>
          </scene>
        </scenes>
      </movie>
    </movies>

Теперь пытаемся выбрать все сцены, в которых участвует Артист А.

Dim Results = From MovieWithArtist In MoviesXML...<scene> _
              Where MovieWithArtist.<sceneartistsnames>.<sceneartistname>.Value = "Artist A" _
              Select MovieWithArtist

Я получаю только одну сцену, а я ожидал две. (

Теперь, если я изменю вторую сцену в XML на:

<movie id="10">
        <scenes>
          <scene id="1">
            <sceneartistsnames>
              <sceneartistname>Artist A</sceneartistname>
              <sceneartistname>Artist B</sceneartistname>
            </sceneartistsnames>
          </scene>
        </scenes>
      </movie>

Потом я возвращаю две сцены.

Что я делаю не так?

Спасибо всем.

Ответы [ 3 ]

1 голос
/ 17 июня 2009

Ради форматирования выложу как отдельный ответ:

Это ответ Джона, преобразованный в VB.Net с использованием этого сайта .

Private Shared Sub Main()
     Dim doc As XDocument = XDocument.Load("movies.xml")

  Dim query = doc.Descendants("scene").Where(Function(scene) scene.Elements("sceneartistsnames").Elements("sceneartistname").Any(Function(name) name.Value = "Artist A"))

     For Each scene In query
         Console.WriteLine(scene)
     Next
    End Sub
0 голосов
/ 17 июня 2009

другая альтернатива ответу Джонса - использовать выбор много (несколько от)

  var qry = from x in xe.Descendants("scene")
            from s in x.Descendants("sceneartistname")
            where (string)s == "Artist A"
            select string.Format("Movie ID {0} Scene ID {1} : {2}", (int)x.Parent.Parent.Attribute("id"), (int)x.Attribute("id"), (string)s);
0 голосов
/ 17 июня 2009

Ну, я не знаю синтаксиса VB.NET XML, боюсь, но этот C # работает нормально:

static void Main()
{
    XDocument doc = XDocument.Load("movies.xml");

    var query = doc.Descendants("scene")
                   .Where(scene => scene.Elements("sceneartistsnames")
                                        .Elements("sceneartistname")
                                        .Any(name => name.Value == "Artist A"));

    foreach (var scene in query)
    {
        Console.WriteLine(scene);
    }
}

Нетрудно преобразовать это в вызовы VB.NET для методов расширения LINQ, но, боюсь, вам понадобится кто-то еще (Джаред?), Чтобы помочь с синтаксисом, специфичным для XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...