深入XML(Windows Phone)世界错误我不理解(';';字符,十六进制值0x20,不能包含在名称中
本文关键字:不能 0x20 包含 十六进制 字符 错误 世界 不理解 Phone 深入 Windows | 更新日期: 2023-09-27 18:28:51
因此,我开始学习如何在应用程序中使用XML数据,并决定使用一些免费数据来实现这一点,但我一辈子都无法让它工作——这是我迄今为止的代码。(我以前用静态数据做过一些应用程序,但嘿,应用程序是为使用网络而设计的,对吗?:p)
public partial class MainPage : PhoneApplicationPage
{
List<XmlItem> xmlItems = new List<XmlItem>();
// Constructor
public MainPage()
{
InitializeComponent();
LoadXmlItems("http://hatrafficinfo.dft.gov.uk/feeds/datex/England/CurrentRoadworks/content.xml");
test();
}
public void test()
{
foreach (XmlItem item in xmlItems)
{
testing.Text = item.Title;
}
}
public void LoadXmlItems(string xmlUrl)
{
WebClient client = new WebClient();
client.OpenReadCompleted += (sender, e) =>
{
if (e.Error != null)
return;
Stream str = e.Result;
XDocument xdoc = XDocument.Load(str);
***xmlItems = (from item in xdoc.Descendants("situation id")
select new XmlItem()
{
Title = item.Element("impactOnTraffic").Value,
Description = item.Element("trafficRestrictionType").Value
}).ToList();***
// close
str.Close();
// add results to the list
xmlItems.Clear();
foreach (XmlItem item in xmlItems)
{
xmlItems.Add(item);
}
};
client.OpenReadAsync(new Uri(xmlUrl, UriKind.Absolute));
}
}
我现在基本上是在努力学习如何做到这一点,因为我很好奇如何真正做到这一步(我知道有很多方法,但ATM这种方式似乎是最简单的)我只是不明白ATM的错误是什么。(*中的位表示错误所在)
我也知道ATM的显示功能不太好(因为它只会显示最后一项),但现在测试一下就可以了。
对一些人来说,这似乎很容易,作为一个学习者,对我来说还不那么容易。
图片形式的错误:(我似乎无法发布图片:/)
提前感谢的帮助
编辑:下面的答案修复了错误:D然而,仍然没有任何进展。我"认为"这是因为XML布局和它的子代数量(无法解决我作为XML的一个角落需要做什么,并将其作为数据源从网络中提取)
也许我开始得太复杂了:/
关于如何正确地从提要中提取一些元素(如Descendants中的所有元素)并存储它们的任何帮助/提示都将非常棒:D
第2版:我让它工作(以一种粗糙的方式),但仍然:D
谢谢Adam Maras!
最后一个问题是双重上市。(将它添加到列表中,然后将其添加到另一个列表中会导致null异常)只需在方法中使用1列表就解决了这个问题(可能不是最好的方法,但它目前有效),并允许我将结果添加到列表框中,直到我花一些时间研究如何使用listbox.ItemTemplate&DataTemplate,使其看起来更有吸引力。(我现在说似乎很容易…)
再次感谢!!!
from item in xdoc.Descendants("situation id")
// ^
XML标记名不能包含空格。查看XML,您可能只希望"situation"
与<situation>
元素匹配。
在查看了您的编辑并进一步查看了XML之后,我发现了问题所在
<d2LogicalModel xmlns="http://datex2.eu/schema/1_0/1_0" modelBaseVersion="1.0">
您将看到它应用了一个默认的命名空间。解决问题最简单的方法是首先从根元素中获取namespsace:
var ns = xdoc.Root.Name.Namespace;
然后将其应用于使用字符串识别元素或属性名称的任何位置:
from item in xdoc.Descendants(ns + "situation")
// ...
item.Element(ns + "impactOnTraffic").Value
item.Element(ns + "trafficRestrictionType").Value
还有一件事:<impactOnTraffic>
和<trafficRestrictionType>
不是<situation>
元素的直接子元素,因此您还需要更改该代码:
Title = items.Descendants(ns + "impactOnTraffic").Single().Value,
Description = item.Descendants(ns + "trafficRestrictionType").Single().Value