0

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

也许我开始太复杂了:/

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

Edit2: 我让它工作(以粗略的方式)但仍然:D

谢谢亚当马拉斯!

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

再次感谢!!!

4

1 回答 1

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">

您会看到它应用了默认命名空间。解决问题的最简单方法是首先从根元素获取名称空间:

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
于 2013-08-23T16:23:45.390 回答