深入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,使其看起来更有吸引力。(我现在说似乎很容易…)

再次感谢!!!

深入XML(Windows Phone)世界错误我不理解(';';字符,十六进制值0x20,不能包含在名称中

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