我是.NET的新手,我对XML感到困惑!我正在尝试为Windows Phone 7制作应用程序,但在尝试读取XML时代码失败。根据表达观察者e.Result是好的。
以下是我正在尝试解析的XML:
<?xml version="1.0" encoding="utf-8"?>
<Arrives>
<Arrive>
<IdStop>803</IdStop>
<idLine>44</idLine>
<IsHead>True</IsHead>
<Destination>MARQUES DE VIANA</Destination>
<IdBus>0000</IdBus>
<TimeLeftBus>405</TimeLeftBus>
<DistanceBus>978</DistanceBus>
<PositionXBus>-1</PositionXBus>
<PositionYBus>-1</PositionYBus>
<PositionTypeBus>1</PositionTypeBus>
</Arrive>
<Arrive>
<IdStop>803</IdStop>
<idLine>12</idLine>
<IsHead>True</IsHead>
<Destination>MARQUES ZAFRA</Destination>
<IdBus>0000</IdBus>
<TimeLeftBus>466</TimeLeftBus>
<DistanceBus>1016</DistanceBus>
<PositionXBus>-1</PositionXBus>
<PositionYBus>-1</PositionYBus>
<PositionTypeBus>1</PositionTypeBus>
</Arrive>
<Arrive>
<IdStop>803</IdStop>
<idLine>44</idLine>
<IsHead>True</IsHead>
<Destination>MARQUES DE VIANA</Destination>
<IdBus>0000</IdBus>
<TimeLeftBus>1077</TimeLeftBus>
<DistanceBus>2714</DistanceBus>
<PositionXBus>-1</PositionXBus>
<PositionYBus>-1</PositionYBus>
<PositionTypeBus>1</PositionTypeBus>
</Arrive>
<Arrive>
<IdStop>803</IdStop>
<idLine>12</idLine>
<IsHead>True</IsHead>
<Destination>MARQUES ZAFRA</Destination>
<IdBus>0000</IdBus>
<TimeLeftBus>1089</TimeLeftBus>
<DistanceBus>3260</DistanceBus>
<PositionXBus>-1</PositionXBus>
<PositionYBus>-1</PositionYBus>
<PositionTypeBus>1</PositionTypeBus>
</Arrive>
</Arrives>
以下是C#中使用System.Xml.Linq&amp;的代码。 System.Collections中:
XElement xmlEMTStop = XElement.Parse(e.Result);
foreach (XElement arriveElement in xmlEMTStop.Descendants())
{
// Recojemos los elementos en el XML
stopElement readElement = new stopElement();
readElement.idStop = (string)arriveElement.Element("idStop").Value;
readElement.idLine = (string)arriveElement.Element("idLine").Value;
readElement.destination = (string)arriveElement.Element("Destination").Value;
readElement.timeLeftBusRaw = (string)arriveElement.Element("TimeLeftBus").Value;
(...)
答案 0 :(得分:2)
你要求所有后代 - 但是假设他们将拥有idStop
,idLine
等子元素。您应该根据它的外观询问所有Arrive
元素:
foreach (XElement arriveElement in xmlEMTStop.Descendants("Arrive"))
接下来,您需要知道LINQ to XML区分大小写。所以这个:
readElement.idStop = (string)arriveElement.Element("idStop").Value;
应该是:
readElement.idStop = arriveElement.Element("IdStop").Value;
或者只是:
readElement.idStop = (string) arriveElement.Element("IdStop");
或者: readElement.idStop = arriElement.Element(“IdStop”)。Value;
(Value
属性已返回string
,但另一种方法是调用XElement
和string
之间的显式转换。)
接下来,一旦你创建了元素,你不清楚你在做什么,但是如果你想创建它们的集合,你可以再次使用LINQ:
var query = XElement.Parse(e.Result)
.Descendants("Arrive")
.Select(x => new StopElement {
IdStop = (string) x.Element("IdStop"),
IdLine = (string) x.Element("IdLine"),
Destination = (string) x.Element("Destination"),
TimeLeftBus = (string) x.Element("TimeLeftBus")
})
.ToList();
请注意,我已经更改了类型和属性名称的大写,以遵循.NET约定。您可能还想更改某些属性的类型 - 例如TimeLeftBus
看起来像是某种数字类型。
答案 1 :(得分:0)
尝试类似于
XDocument xdoc = XDocument.Load("data.xml");
var arrivesItems = from c in doc.Root.Descendants("Arrive") select c;
foreach (var item in arrivesItems) {
var idStop = item.Element("idStop").Value;
...
}