2013-03-04 249 views
2

我正在使用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> 

我的代碼就像

public class Notch 
{ 
    [XmlAttribute("name")] 
    public string name { get; set; } 

    [XmlAttribute("games")] 
    public List<string> Titles { get; set; } 

    [XmlAttribute("url")] 
    public List<string> Image { get; set; } 
} 


[XmlRoot("root")] 
public class Notchs 
{ 
    [XmlArray("Peoples")] 
    [XmlArrayItem("Person")] 
    [XmlArrayItem("Details")] 
    public ObservableCollection<Notch> Collection { get; set; } 
} 

我的XAML文件

<ListBox x:Name="NotchsList" 
     SelectionChanged="NotchsList_SelectionChanged" Margin="0,-5.25,22,0" Grid.Row="1" HorizontalAlignment="Right" Width="768" Grid.Column="1" Grid.RowSpan="3" d:LayoutOverrides="VerticalMargin"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 

        <StackPanel Margin="0,0,0,0" Orientation="Vertical" Grid.ColumnSpan="2" 
         Grid.Column="0" 
         Height="160" 
         VerticalAlignment="Top"> 
         <StackPanel Background="#eb2427" Orientation="Vertical"> 
          <TextBlock Grid.Row="1" FontFamily="Calibri" FontSize="34" FontWeight="Bold" FontStyle="Normal" Margin="10,0,0,0" 
           Text="{Binding name}" 
            />    
         </StackPanel> 
         <StackPanel Orientation="Horizontal"> 
          <TextBlock Grid.Row="1" FontFamily="Calibri" FontSize="32" Foreground="#a7a9ac" 
           Text="{Binding games}" ScrollViewer.HorizontalScrollBarVisibility="Visible"/>  

         </StackPanel> 
         <StackPanel Orientation="Horizontal"> 
          <Image Grid.Row="1" Source="{Binding Image}" VerticalAlignment="top" /> 
         </StackPanel>   
       </StackPanel> 
       </Grid> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

我得到的輸出如

拉賈

System.collection.generic.list'1[System.String] 

    System.collection.generic.list'1[System.String] 

拉瑪

System.collection.generic.list'1[System.String] 

    System.collection.generic.list'1[System.String] 

回答

1

正如其他人已經

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> 

這是使用你的代碼複製粘貼,但我刪除以下生產線提到你的XML有幾個錯別字。修復並刪除未使用的XmlSerializer後,您的查詢生成有效的IEnumerable<Notch>。一切按預期工作。

但是我強烈懷疑你想在你的Titles列表中擁有完整的屬性。其實你想要有他們的價值。所以,你必須寫Attribute(...).Value,省略ToString()

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); 
    } 
} 

請注意,我用的是Zip擴展方法相關的標題和圖像的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。這裏是一個「輕微」簡化,但工作版本:

<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> 

,這是它的外觀:

output.png

+0

嗨,感謝重播。, – user123 2013-03-05 07:00:40

+0

嗨,我希望你的回答我得到了同樣的事情上面你的答案,但我需要的圖像不喜歡路徑 – user123 2013-03-05 08:50:23

+0

嗨,我想滾動下面的圖像與title.you獲取值列表box.i不想要綁定這種類型我想要下面的圖像名稱想滾動與title.so請電話給我任何想法..., – user123 2013-03-05 10:55:10

3

您需要更改

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

到:

s.Attribute("games").Value.ToString() 
x.Attribute("url").Value.ToString() 
+0

您好感謝重播我試過,但我有錯誤,如\t 1無法隱式轉換鍵入'System.Collections.Generic.IEnumerable '到'System.Collections.Generic.List '。存在明確的轉換(你是否缺少演員?) – user123 2013-03-04 05:05:49

+0

我不太瞭解每個對象是什麼,所以很難說。什麼是NotchsList.ItemsSource?這很可能是導致問題的原因。將其更改爲「var source = query.ToList()」對我來說工作正常。此外,反序列化並不需要得到你想要的。說實話有點混亂。 – doiley 2013-03-04 05:28:53

+0

嗨,謝謝你的重播,我希望你回答。 linq to xml.so是新的,請告訴我我想寫什麼? – user123 2013-03-04 05:42:48

2

後修復你的XML標籤結尾 - 關閉所有event_image標籤,並刪除如下象棋圖像中的「1」,並刪除代碼的第1行和第3行,最後一行 - 未使用的串行器和調用它。我得到了以下的輸出: - :

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 
+0

嗨,感謝重播你嘗試過的代碼?我不能得到 – user123 2013-03-04 09:55:28

+0

@ user123:他試過你的代碼 - 修復格式錯誤的XML並刪除未使用的序列化程序。這是你的代碼產生這個結果。 – pescolino 2013-03-04 13:54:42

+0

正如@pescolino所言。我也繼續前進,並明確列出我刪除的行以使其起作用。 P.S.感謝pescolino提供更及時的迴應。 – 2013-03-04 15:59:31