我正在使用visual studio for windows phone,当XML数据的父级中有属性时,我的XML阅读器代码不起作用。
我的C#代码
namespace youtube_xml
{
public partial class MainPage : PhoneApplicationPage
{
// Constructor
public MainPage()
{
InitializeComponent();
SupportedOrientations = SupportedPageOrientation.PortraitOrLandscape;
}
private void listBox1_Loaded(object sender, RoutedEventArgs e)
{
var element = XElement.Load("Authors.xml");
var authors =
from var in element.Descendants("feed")
select new Authors
{
AuthorName = var.Attribute("scheme").Value,
};
listBoxAuthors.DataContext = authors;
}
public ImageSource GetImage(string path)
{
return new BitmapImage(new Uri(path, UriKind.Relative));
}
}
}
工作XML数据
<?xml version='1.0' encoding='UTF-8'?>
<feed>
<category scheme='http://schemas.google.com/g/2005#kind'/>
</feed>
不工作数据(注意:根元素“feed”中的属性“xmlns”)
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' >
<category scheme='http://schemas.google.com/g/2005#kind'/>
</feed>
答案 0 :(得分:1)
欢迎来到 XML命名空间的世界!问题不在于“有一个属性”这一事实 - 它导致它下面的所有内容都在命名空间中。您不能再说.Attribute("scheme")
因为它只查找空命名空间中的内容。命名空间通过基于运算符重载的装置使用:
XNamespace atom = "http://www.w3.org/2005/Atom'";
// And now you can say:
.Descendants(atom + "feed")
.Attribute(atom + "scheme")
等等。由于隐式转换运算符,将字符串分配到XNamespace变量的能力。这里的+
实际上构造了一个XName(顺便说一下,它也有一个来自字符串的隐式转换 - 即使参数类型不是字符串,这就是你.Elements("feed")
工作的原因)
方便提示:您可以将属性转换为特定类型,而不是使用.Value
,例如(string)foo.Attribute(atom + "scheme")
。它也适用于许多其他类型,例如int
。