1

我对 .NET 很陌生,我对 XML 感到困惑!我正在尝试为 Windows Phone 7 制作应用程序,但尝试读取 XML 时代码失败。根据表达式 watcher 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>

这是使用 System.Xml.Linq 和 System.Collections 的 C# 代码:

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

2 回答 2

2

您要求所有后代 - 但假设他们将拥有idStop, idLineetc 子元素。从外观上看,您应该要求所有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 = 到达Element.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- 例如,它看起来像是某种数字类型。

于 2012-11-05T19:11:05.023 回答
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;
...

}
于 2012-11-05T19:17:59.497 回答