在阅读XML时没有按预期工作

时间:2012-11-05 19:07:35

标签: c# xml

我是.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;
(...)

2 个答案:

答案 0 :(得分:2)

你要求所有后代 - 但是假设他们将拥有idStopidLine等子元素。您应该根据它的外观询问所有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,但另一种方法是调用XElementstring之间的显式转换。)

接下来,一旦你创建了元素,你不清楚你在做什么,但是如果你想创建它们的集合,你可以再次使用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;
...

}