0

私はこの単純な XML ファイルを持っています:

<?xml version="1.0" encoding="utf-8" ?>
<Artists>
 <artist artistId="1">
<name>ManyBass</name>
<genre>Electronic</genre>
 <album>Fireblue</album>
 <player>
    <song path="Fireblue.mp3"/>
    <song path="Porthole.mp3"/>
</player>
 </artist>
</Artists>

すべての曲のパスを取得して、次のように ListBox に追加したい:

XDocument loaded = XDocument.Load(path);
var q = from c in loaded.Descendants("player")
        select (string)c.Element("song path");
foreach (string track in q)
{
   myList.Items.Add(track);
}

しかし、トラック文字列が SystemNullExceptionError を起動するため、プログラムがクラッシュします。誰かが属性を適切に取得するのを手伝ってくれますか:

歌の道

私のXMLファイルから?ご協力いただきありがとうございます。

4

3 に答える 3

3
List<string> songs = (from c in loaded.Descendants("song")
                    select c.Attribute("path").Value).ToList();

また、Artistタグを閉じて XML を修正します。

于 2012-04-08T19:23:14.547 に答える
3

MVVM スタイルのアプローチでは、バック コードで ListBox の内容を設定する必要がないように、ListBox を XML ドキュメントに直接バインドする必要があります。

XAML:

<Grid>
    <Grid.DataContext>
        <XmlDataProvider Source="Artists.xml" XPath="/Artists/artist"/>
    </Grid.DataContext>
    <ListBox ItemsSource="{Binding}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <DockPanel>
                    <TextBlock Text="{Binding XPath=./name}" DockPanel.Dock="Left"/>
                    <ListBox ItemsSource="{Binding XPath=./player/song}" DockPanel.Dock="Right">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding XPath=@path}"/>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
                </DockPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>      
</Grid>
于 2012-04-08T21:01:38.973 に答える
2
  • <artist>XML が間違っています。閉じたタグがありません
  • 名前で要素にアクセスしていますが、属性"song path"を持つ要素しかありませんsongpath

クエリ:

XDocument xdoc = XDocument.Load(path);

// type is IEnumerable<string>
var songs = xdoc.Descendants("song")                
                .Select(p => p.Attribute("path").Value);

固定 XML:

<?xml version="1.0" encoding="utf-8" ?>
<Artists>
<artist artistId="1">
   <name>ManyBass</name>
   <genre>Electronic</genre>
   <album>Fireblue</album>
   <player>
       <song path="Fireblue.mp3"/>
       <song path="Porthole.mp3"/>
   </player>
</artist>
</Artists>
于 2012-04-08T19:15:22.777 に答える