如何在C#中解析嵌套的XML

时间:2013-11-03 21:58:23

标签: c# xml xml-parsing

我正在使用API​​并以XML格式检索数据。这是我的XML:

<RTT>
  <AgencyList>
    <Agency Name="Caltrain" HasDirection="True" Mode="Rail">
      <RouteList>
        <Route Name="BABY BULLET" Code="BABY BULLET">
          <RouteDirectionList>
            <RouteDirection Code="SB2" Name="SOUTHBOUND TO TAMIEN">
              <StopList>
                <Stop name="Sunnyvale Caltrain Station" StopCode="70222">
                  <DepartureTimeList/>
                </Stop>
              </StopList>
            </RouteDirection>
            <RouteDirection Code="NB" Name="NORTHBOUND TO SAN FRANCISCO">
              <StopList>
                <Stop name="Sunnyvale Caltrain Station" StopCode="70221">
                  <DepartureTimeList>
                    <DepartureTime>69</DepartureTime>
                  </DepartureTimeList>
                </Stop>
              </StopList>
            </RouteDirection>
          </RouteDirectionList>
        </Route>
        <Route Name="LIMITED" Code="LIMITED">...</Route>
        <Route Name="LOCAL" Code="LOCAL">...</Route>
      </RouteList>
    </Agency>
  </AgencyList>
</RTT>

并非每个DepartureTimeList都有一个DepartureTime子节点。这是我到目前为止所获得的路径名称:

List<string> trainType = new List<string>();
XDocument doc = XDocument.Load("http://services.my511.org/Transit2.0/GetNextDeparturesByStopName.aspx?token=0f01ac4a-bc16-46a5-8527-5abc79fee435&agencyName=Caltrain&stopName=" + DropDownList1.SelectedItem.Text.ToString());
doc.Save("times.xml");
string feed = doc.ToString();


XmlReader r = XmlReader.Create(new StringReader(feed));
r.ReadToFollowing("RouteList");
if (r.ReadToDescendant("Route"))
{
    do
    {
        trainType.Add(r.GetAttribute("Name"));
    } while (r.ReadToNextSibling("Route"));
}

我最感兴趣的是出发时间(如果存在的话),我整个下午一直在努力解析它。

1 个答案:

答案 0 :(得分:2)

试试这个......希望这样做。

    XmlDocument doc = new XmlDocument();
    doc.Load("xml path");
    XmlNode node = doc.SelectSingleNode("/RTT");
    foreach (XmlNode nodes in node.SelectNodes(
        "/AgencyList/Agency Name/RouteList/Route"))
    {
        trainType.Add(r.GetAttribute("Name"));
        XmlNode s = nodes.SelectSingleNode("Route Name/RouteDirectionList/RouteDirection Code/StopList/Stop");
        if (s != null && s["DepartureTimeList"].HasChildNodes)
        {
            // do stuff here
        }
    }
相关问题