我正在使用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解析的任何内容。我想我的后代/元素已经混淆了,我很感激你的帮助!
答案 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
强>