C# 获取列表

C# 获取列表,c#,linq,linq-to-xml,C#,Linq,Linq To Xml,我正在使用linq代码解析XML文件。这是我的代码。我想要绑定详细信息和图像列表 XmlSerializer serializer = new XmlSerializer(typeof(Notchs)); XDocument xmlDoc = XDocument.Parse(dataInXmlFile); Notchs notchs = (Notchs)serializer.Deserialize(xmlDoc.CreateReader()); var query = from l in xm

我正在使用linq代码解析XML文件。这是我的代码。我想要绑定详细信息和图像列表

XmlSerializer serializer = new XmlSerializer(typeof(Notchs));
XDocument xmlDoc = XDocument.Parse(dataInXmlFile);
Notchs notchs = (Notchs)serializer.Deserialize(xmlDoc.CreateReader());

var query = from l in xmlDoc.Descendants("Person")
            select new Notch
            {
                name = (string)l.Attribute("name").Value,
                Titles = l.Element("Details").Elements("detail")
                           .Select(s => s.Attribute("games").ToString())
                           .ToList(),

                Image = l.Element("Details").Elements("detail").Elements("event_image").Elements("image")
                         .Select(x => x.Attribute("url").ToString()).ToList()
            };

foreach (var result in query)
{
    Console.WriteLine(result.name);
    foreach (var detail in result.Titles)
    {
        Console.WriteLine(detail);
    }
}
NotchsList.ItemsSource = query.ToList();
这是我正在使用的XML文件,我想得到的名称和游戏的形象

<?xml version="1.0" encoding="utf-8"?>
<root>
 <Peoples>
  <Person name="Raja">
   <Details>
    <detail games="Cricket">
      <event_image>
        <image  url="http://Cricket.jpeg"/>
      <event_image>
    </detail>
    <detail games="Foot Ball">
     <event_image>
       <image  url="http://FootBall.jpeg"/>
     <event_image>
    </detail>
    <detail games="Volley Ball">
     <event_image>
      <image  url="http://.Volley.jpeg3"/>
     <event_image>
    </detail>
   </Details>
  </Person>
  <Person name="Rama">
    <Details>
     <detail games="Chess">
      <event_image>
        <image  url="http://Chess.jpeg"/1>
      <event_image>
     </detail>
     <detail games="Table Tennis">
      <event_image>
       <image  url="http://TTennis.jpeg"/>
      <event_image>
     </detail>
     <detail games="Carrom">
      <event_image>
       <image  url="http://Carrom.jpeg"/>
      <event_image>
     </detail>
   </Details>
  </Person>
 </Peoples>
</root>
拉玛

你需要改变

s.Attribute("games").ToString()
x.Attribute("url").ToString()
致:


修复XML标记结尾后-关闭所有事件图像标记并删除“1”,如果象棋图像如下所示,并删除代码的第1行和第3行,以及最后一行-序列化程序并调用未使用的序列化程序。我得到了以下输出:

Raja
games="Cricket"
games="Foot Ball"
games="Volley Ball"
Rama
games="Chess"
games="Table Tennis"
games="Carrom"
--


正如其他人已经提到的,您的XML有一些拼写错误。修复该问题并删除未使用的
XmlSerializer
后,查询将生成有效的
IEnumerable
。一切正常

但我强烈怀疑您是否希望在
标题
列表中包含完整属性。实际上,你想知道他们的价值观。因此,您必须编写
属性(…).Value
并省略
ToString()

注意,我使用扩展方法来组合相关的标题和图像URL。但这只是为了更好的产出。数据已经正确了。这是输出:

Raja
Cricket http://Cricket.jpeg
Foot Ball http://FootBall.jpeg
Volley Ball http://.Volley.jpeg3
Rama
Chess http://Chess.jpeg
Table Tennis http://TTennis.jpeg
Carrom http://Carrom.jpeg
但是,您的数据不会显示在列表框中。您绑定到
games
而不是
Titles
,并使用
TextBlock
显示生成您提到的输出的列表。它也应该是一个
列表框
。以下是一个“稍微”简化但有效的版本:

<ListBox x:Name="NotchsList">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <StackPanel Orientation="Vertical">
        <TextBlock Text="{Binding name}" />
        <StackPanel Orientation="Horizontal">
          <ListBox ItemsSource="{Binding Titles}" Width="200" />
          <ListBox ItemsSource="{Binding Image}" Width="200" />
        </StackPanel>
      </StackPanel>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

这就是它的样子:


您好,多亏了replay,我尝试了此操作,但出现了如下错误:1无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“System.Collections.Generic.List”。存在一个显式转换(是否缺少一个转换?)我真的不明白每个对象是什么,所以很难分辨。什么是NotchList.ItemsSource?这很可能是导致问题的原因。将其更改为“var source=query.ToList()”对我来说很好。此外,反序列化不是获得所需内容所必需的。说实话,这有点混乱。你好,多利,谢谢你的重播,我希望你能回答。我是linq to xml新手。所以请告诉我我想写什么?看看其他答案,它们都提供了更多关于您应该做什么的信息。我不会写他们写的东西。希望我能帮上忙。@user123:他尝试了你的代码-修复格式错误的xml并删除未使用的序列化程序。正如@pescolino所说,是您的代码产生了这个结果。我还继续并明确列出了为使其正常工作而删除的行。另外,感谢pescolino提供更及时的回复。是的,您说的是正确的,但您可以在哪里显示输出?NotchList是列表框x:Name.i,通过listbox@Infinite可能性第一件事我想用图像绑定游戏,第二件事是列表需要水平滚动视图,如板球图像下方的板球,足球低于足球图像。嗨,我希望你的答案我在你的答案上面得到了相同的东西,但我需要的图像不是pathhi,我需要在图像下方滚动标题。你正在将值添加到列表框中。我不想绑定此类型,我要名称在图像下方滚动标题。因此,请告诉我任何想法…,@user123:你需要一个。你也必须这样做。
s.Attribute("games").ToString()
x.Attribute("url").ToString()
s.Attribute("games").Value.ToString()
x.Attribute("url").Value.ToString()
Raja
games="Cricket"
games="Foot Ball"
games="Volley Ball"
Rama
games="Chess"
games="Table Tennis"
games="Carrom"
<?xml version="1.0" encoding="utf-8"?>
<root>
  <Peoples>
    <Person name="Raja">
      <Details>
        <detail games="Cricket">
          <event_image>
            <image  url="http://Cricket.jpeg"/>
          </event_image>
        </detail>
        <detail games="Foot Ball">
          <event_image>
            <image  url="http://FootBall.jpeg"/>
          </event_image>
        </detail>
        <detail games="Volley Ball">
          <event_image>
            <image  url="http://.Volley.jpeg3"/>
          </event_image>
        </detail>
      </Details>
    </Person>
    <Person name="Rama">
      <Details>
        <detail games="Chess">
          <event_image>
            <image  url="http://Chess.jpeg"/>
          </event_image>
        </detail>
        <detail games="Table Tennis">
          <event_image>
            <image  url="http://TTennis.jpeg"/>
          </event_image>
        </detail>
        <detail games="Carrom">
          <event_image>
            <image  url="http://Carrom.jpeg"/>
          </event_image>
        </detail>
      </Details>
    </Person>
  </Peoples>
</root>
XmlSerializer serializer = new XmlSerializer(typeof(Notchs)); //first line
Notchs notchs = (Notchs)serializer.Deserialize(xmlDoc.CreateReader()); //third line
NotchsList.ItemsSource = query.ToList(); //last line in your code snippet
var query = from l in xmlDoc.Descendants("Person")
            select new Notch
            {
                name = (string)l.Attribute("name").Value,
                Titles = l.Element("Details").Elements("detail")
                          .Select(s => s.Attribute("games").Value)
                          .ToList(),

                Image = l.Element("Details").Elements("detail")
                         .Elements("event_image").Elements("image")
                         .Select(x => x.Attribute("url").Value).ToList()
            };

foreach (var result in query)
{
    Console.WriteLine(result.name);
    foreach (var detail in result.Titles.Zip(result.Image, (st, si) => string.Format("{0} {1}", st, si)))
    {
        Console.WriteLine(detail);
    }
}
Raja
Cricket http://Cricket.jpeg
Foot Ball http://FootBall.jpeg
Volley Ball http://.Volley.jpeg3
Rama
Chess http://Chess.jpeg
Table Tennis http://TTennis.jpeg
Carrom http://Carrom.jpeg
<ListBox x:Name="NotchsList">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <StackPanel Orientation="Vertical">
        <TextBlock Text="{Binding name}" />
        <StackPanel Orientation="Horizontal">
          <ListBox ItemsSource="{Binding Titles}" Width="200" />
          <ListBox ItemsSource="{Binding Image}" Width="200" />
        </StackPanel>
      </StackPanel>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>