在组织不太好的xml中使用Linq进行分组

在组织不太好的xml中使用Linq进行分组,linq,windows-phone-7,linq-to-xml,yql,Linq,Windows Phone 7,Linq To Xml,Yql,我正在使用YQL获取一些数据,这是我的xml: <?xml version="1.0" encoding="UTF-8"?> <div id="content> <div id="html"> <h3>City</h3> <div id="movie"> <h4> <a href="">movie 1</a> </h4> <div>

我正在使用YQL获取一些数据,这是我的xml:

<?xml version="1.0" encoding="UTF-8"?>
<div id="content>
<div id="html">
<h3>City</h3>
<div id="movie">
    <h4>
        <a href="">movie 1</a>
    </h4>
<div>
<div id="movie>
    <h4>
        <a href="">movie 2</a>
    </h4>
</div>
    .
    .
    .

<h3>City 2</h3>
<div id="movie">
    <h4>
        <a href="">movie 1</a>
    </h4>
<div>
<div id="movie>
    <h4>
        <a href="">movie 2</a>
    </h4>
</div>
但是,由于所有的XML都在具有id内容的div中,所以我被困在这里


一个LINQ语句怎么能解决这个问题呢?

我试图将您发布的输入变形为一些格式良好的XML:

<div id="content">
  <div id="html">
    <h3>City</h3>
    <div id="movie">
      <h4>
        <a href="">movie 1</a>
      </h4>
    </div>
    <div id="movie">
      <h4>
        <a href="">movie 2</a>
      </h4>
    </div>
    .
    .
    .

    <h3>City 2</h3>
    <div id="movie">
      <h4>
        <a href="">movie 1</a>
      </h4>
    </div>
    <div id="movie">
      <h4>
        <a href="">movie 2</a>
      </h4>
    </div>
  </div>
</div>

请发布格式良好的XML示例,否则很难理解输入文档的结构。目前,您打开了几个
,但没有匹配
.Thx来格式化我的xml。联合方法确实给我带来了结果。但是我忘了提到我有一个对象,我想用这个值填充它。一个变量是城市,另一个变量是电影。如何使用linq获得这些分离的值,以便于填充?ThxxI将编辑帖子,向您显示一些分组代码,然后创建一个匿名类型,其中包含城市的字符串属性和电影列表。我没有从使用group by的新linq获得任何结果。但现在我更清楚了,我可以试着在这里解决它。每当我找到一个解决方案,我都会把它贴在这里。谢谢!
<div id="content">
  <div id="html">
    <h3>City</h3>
    <div id="movie">
      <h4>
        <a href="">movie 1</a>
      </h4>
    </div>
    <div id="movie">
      <h4>
        <a href="">movie 2</a>
      </h4>
    </div>
    .
    .
    .

    <h3>City 2</h3>
    <div id="movie">
      <h4>
        <a href="">movie 1</a>
      </h4>
    </div>
    <div id="movie">
      <h4>
        <a href="">movie 2</a>
      </h4>
    </div>
  </div>
</div>
    XDocument doc = XDocument.Load("input.xml");
    List<string> data =
        doc.Descendants("h3")
        .Union(
          doc.Descendants("div")
          .Where(d => (string)d.Attribute("id") == "movie")
          .Elements("h4")
          .Elements("a")
          ).InDocumentOrder()
        .Select(e => e.Value)
        .ToList();
    XDocument doc = XDocument.Load("input.xml");
    var groupedData =
        (from movie in doc.Root.Descendants("div")
         where (string)movie.Attribute("id") == "movie"
         group movie by movie.ElementsBeforeSelf("h3").Last() into g
         select new
         {
             city = g.Key.Value,
             movies = (from m in g
                       select (string)m.Element("h4").Element("a")).ToList()
         }).ToList();

    // now use above list for data binding or 
    // in the simplest case just consume it with foreach:
    foreach (var group in groupedData)
    {
        Console.WriteLine("city: {0}:", group.city);
        foreach (var movie in group.movies)
        {
            Console.WriteLine(movie);
        }
    }