C# 读取XML时未按预期工作

C# 读取XML时未按预期工作,c#,xml,C#,Xml,我对.NET非常陌生,我对XML感到困惑!我正在尝试为WindowsPhone7制作一个应用程序,但在尝试读取XML时代码失败。根据表达式watcher e,结果是ok 以下是我试图解析的XML: <?xml version="1.0" encoding="utf-8"?> <Arrives> <Arrive> <IdStop>803</IdStop> <idLine>44</idLine>

我对.NET非常陌生,我对XML感到困惑!我正在尝试为WindowsPhone7制作一个应用程序,但在尝试读取XML时代码失败。根据表达式watcher e,结果是ok

以下是我试图解析的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>
您要求所有的子元素,但假设它们将有
idStop
idLine
等子元素。从外观上看,您应该要求所有
到达
元素:

foreach (XElement arriveElement in xmlEMTStop.Descendants("Arrive"))
接下来,您需要知道LINQ到XML是区分大小写的。因此:

readElement.idStop = (string)arriveElement.Element("idStop").Value;
应该是:

readElement.idStop = arriveElement.Element("IdStop").Value;
或者只是:

readElement.idStop = (string) arriveElement.Element("IdStop");
或: readElement.idStop=arriveElement.Element(“idStop”).Value

属性已经返回
字符串
,但另一种方法是调用
元素
字符串
之间的显式转换)

接下来,不清楚创建元素后您将如何处理它们,但是如果您试图创建元素的集合,您可以再次使用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
看起来像是某种数字类型。

请尝试类似的smth

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;
...

}

我认为最好使用
System.Xml.XPath
实现这一点。代码“失败”是什么意思?你认为会发生什么事而不会发生?e是什么?如何申报?初始化它?@JordanKaye:为什么?根据我的经验,LINQ到XML几乎总是比较容易的,而且这看起来像是一个非常简单的查询。@JordanKaye:LINQ到XML的好处是,您在“语言中的语言”中工作的程度不同。如果我在XPath中有语法错误,在运行它之前(或者在单独的工具中尝试),我无法找到它。在C#中,我将立即得到错误。用更熟悉的语言编写复杂的条件、转换等也更容易。我也同样讨厌在代码中嵌入SQL,顺便说一句:)请看我的感受的更多细节。我觉得自己很笨。我向你保证我已经看了好几遍大写和小写,但我没有看到“I”。非常感谢,真的。
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;
...

}