深入研究XML世界(Windows Phone)错误我不明白(''字符,十六进制值0x20,不能包含在名称中。)

时间:2013-08-23 14:41:06

标签: c# xml windows windows-phone-7 windows-phone-8

所以我开始学习如何在应用程序中使用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作为菜鸟并将其作为数据源从网上拉出来)

也许我开始太复杂了:/

关于如何从Feed中提取某些元素(正如Descendants中的所有元素)正确并存储它们的任何帮助/提示都会很棒:D

EDIT2: 我有它工作(粗略地)但仍然:D

感谢Adam Maras!

最后一个问题是双重上市。 (将它添加到列表,然后将其添加到另一个列表导致空异常)只是在方法中使用1列表解决了这个问题,(可能不是最好的方法,但它现在可以工作)并允许我将结果添加到列表框中,直到我花了一些时间来研究如何使用ListBox.ItemTemplate&amp; DataTemplate使它看起来更具吸引力。 (我现在说似乎很容易......)

再次感谢!!!

1 个答案:

答案 0 :(得分:1)

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