阅读XML的多个部分

时间:2015-06-14 08:38:33

标签: c# xml

我正在使用XML文件构建Windows应用程序,其中包含大量嵌套 - 就像这样。

当我沿着节点走下去时,我需要访问一个属性。我需要为每条"路线"继续这样做。物品可用(可能有多个目的地和旅行)。

所以我的结束旅行对象将有:

RouteNo = O
Destination = Queenspark
ETA = 28

XML文件:

<JPRoutePositionET xsi:schemaLocation="urn:connexionz-co-nz:jp JourneyPlanner.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:connexionz-co-nz:jp">
    <Content MaxArrivalScope="60" Expires="2015-06-14T20:21:01+12:00"/>
    <Platform Name="Manchester St & Gloucester St" PlatformTag="3330">
        <Route Name="Orange Line" RouteNo="O">
            <Destination Name="Queenspark">
                <Trip WheelchairAccess="true" TripNo="5497" ETA="28"/>
                <Trip WheelchairAccess="true" TripNo="5498" ETA="59"/>
            </Destination>
        </Route>
    </Platform>
</JPRoutePositionET>

我的C#代码:

{   
    XDocument loadedData = XDocument.Load(streamReader);
    string StopName = loadedData.Root.Element("Platform").Attribute("Name").Value.ToString();

    var data = from query in loadedData.Descendants("Route")
               select new Trip
               {
                   RouteNo = (string)query.Attribute("RouteNo").Value ?? "test",
                   Destination = (string)query.Descendants("Destination").First().Attribute("Name").Value ?? "test",
                   Eta = (string)query.Element("Trip").Attribute("ETA").Value ?? "5"
               };

    List<Trip> trip = new List<Trip>();
    foreach(var a in data)
    {
        trip.Add(a);
    }

    var dispatcher = CoreApplication.MainView.CoreWindow.Dispatcher;
    try
    {
        await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
        {
             listView.ItemsSource = data.ToList();
        });

    }
    catch
    {

    }
}

现在,我的代码只是运行而且没有显示任何内容。调试器也没有显示从XML解析的任何内容。我想我的后代/元素已经混淆了,我很感激你的帮助!

1 个答案:

答案 0 :(得分:1)

导致代码无显示的核心问题 - 其他问题是,您的XML具有默认命名空间,并且所有后代元素都隐式继承祖先默认命名空间,除非另有说明。您需要使用完全限定名称来通过使用XNamespace +元素的本地名称的组合来寻址命名空间中的元素f.e。

我个人更喜欢这个特定任务的查询语法,请尝试这种方式:

XNamespace d = "urn:connexionz-co-nz:jp";
var data = from route in loadedData.Descendants(d+"Route")
           from destination in route.Elements(d+"Destination")
           from trip in destination.Elements(d+"Trip")
           let routeNo = (string)route.Attribute(d+"RouteNo") ?? "test"
           let currentDestination = (string)destination.Attribute(d+"Name") ?? "test"
           select new Trip
           {
               RouteNo = routeNo,
               Destination = currentDestination,
               Eta = (string)trip.Attribute("ETA") ?? "5"
           };

<强> Dotnetfiddle Demo