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 直接绑定到 XML 文档,这样您就不必在后面的代码中设置 ListBox 的内容。

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
  • 您的 XML 错误,您没有关闭<artist>标签
  • 您正在按名称访问元素,"song path"但您只有song具有属性的元素path

询问:

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