2014-06-21 83 views
2

我有一个链接到在我的应用程序中读取的在线XML文件。 这是XML的一部分:我如何阅读这个XML部分?

<ActueleVertrekTijden> 
<VertrekkendeTrein> 
    <RitNummer>4085</RitNummer> 
    <VertrekTijd>2014-06-13T22:00:00+0200</VertrekTijd> 
    <EindBestemming>Rotterdam Centraal</EindBestemming> 
    <TreinSoort>Sprinter</TreinSoort> 
    <RouteTekst>A'dam Sloterdijk, Amsterdam C., Duivendrecht</RouteTekst> 
    <Vervoerder>NS</Vervoerder> 
    <VertrekSpoor wijziging="false">4</VertrekSpoor> 
    <Opmerkingen> 
    <Opmerking> Rijdt vandaag niet</Opmerking> 
    </Opmerkingen> 
</VertrekkendeTrein> 
</ActueleVertrekTijden> 

我想读这是在“Opmerkingen”上市,并站在“VertrekkendeTrein”中的“附注”:

<Opmerkingen> 
    <Opmerking> Rijdt vandaag niet</Opmerking> 
</Opmerkingen> 

的问题是,它并不总是存在,它将取决于情况。

我可以读像“RitNummer”和“Vervoerder”的其他部分,我用下面的代码来做到这一点:

string urlo = "THEWEBSITE"; 
      string resultje = HttpGeto(urlo); 

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml(resultje); 
XmlNodeList nodeList = xmlDoc.SelectNodes("ActueleVertrekTijden/VertrekkendeTrein/*"); 



     foreach (XmlNode nodelist2 in nodeList) 
      {//14 101517 
      //int i = 0;//if (i == 0) { i++; } 
       if (i < 1) //1 
       { 

       switch (nodelist2.Name) 
        { 
        case "VertrekTijd": string kuttijd1 = (nodelist2.InnerText); 
        var res1 = Regex.Match(kuttijd1, @"\d{1,2}:\d{1,2}").Value; 
        lblv1.Text = Convert.ToString(res1); break; 
        case "VertrekVertragingTekst": var tobiasisnietvantexel1 = (nodelist2.InnerText); if (tobiasisnietvantexel1 == null) {} else{ ververt1.Text = tobiasisnietvantexel1; ververt1.Visible = true; vertpic1.Visible = true; logo1.Top -= 9; lblts1.Top -= 9; } break; 
        case "EindBestemming": string vertrek1 = (nodelist2.InnerText); if (vertrek1 == "Uitgeest") { lblvia1.Text = "Krommenie-Ass"; } lblbs1.Text = vertrek1; break; 
        case "TreinSoort": lblts1.Text = (nodelist2.InnerText); break; 
        case "RouteTekst": lblvia1.Text = (nodelist2.InnerText); break; 
        case "VertrekSpoor": lbls1.Text = (nodelist2.InnerText); i++; break; 


        } 


       } 
      } 

我尝试了很多,如:

case "Opmerking": var texeliseeneiland1 

case "Opmerkingen/Opmerking": var texeliseeneiland1 

有没有办法让我可以为“Opmerking”做个案?

谢谢!

回答

1

您可以尝试将XML节点列表/集合转换为可查询数据结构,并使用System.Linq来查看它是否包含以及Opmerking。虽然这是我的偏好,因为我一直在做很多数据库查询。

在你的情况,你switch声明,很多情况下,你可以尝试以下操作:

在为“Opmerkingen”鸟巢的情况下另一种情况,看它是否有一个子节点“附注”,和比用这个“Opmerking”节点做点什么。或者让“Opmerkingen”这个例子调用一个函数来处理“opmerking”节点。

编辑为例:

foreach (XmlNode nodelist2 in nodeList) 
     {//14 101517 
     //int i = 0;//if (i == 0) { i++; } 
      if (i < 1) //1 
      { 

      switch (nodelist2.Name) 
       { 
       case "VertrekTijd": string kuttijd1 = (nodelist2.InnerText); 
       var res1 = Regex.Match(kuttijd1, @"\d{1,2}:\d{1,2}").Value; 
       lblv1.Text = Convert.ToString(res1); break; 
       case "VertrekVertragingTekst": var tobiasisnietvantexel1 = (nodelist2.InnerText); if (tobiasisnietvantexel1 == null) {} else{ ververt1.Text = tobiasisnietvantexel1; ververt1.Visible = true; vertpic1.Visible = true; logo1.Top -= 9; lblts1.Top -= 9; } break; 
       case "EindBestemming": string vertrek1 = (nodelist2.InnerText); if (vertrek1 == "Uitgeest") { lblvia1.Text = "Krommenie-Ass"; } lblbs1.Text = vertrek1; break; 
       case "TreinSoort": lblts1.Text = (nodelist2.InnerText); break; 
       case "RouteTekst": lblvia1.Text = (nodelist2.InnerText); break; 
       case "VertrekSpoor": lbls1.Text = (nodelist2.InnerText); i++; break; 

       //Here's the case you might try adding 
       case "Opmerkingen": var SomeVar = OpmerkingenMethod(nodelist2); break; 
       //or do something else that you want to do, instead of breaking, 
       //I do not know what you want to do with Opmerking when you get it 
       // so I just had the function output into another variable. 
       } 


      } 
     } 

以下是你可能在Opmerkingen的情况下使用,这样就可以得到附注和做的东西的方法的例子。同样,我不知道你想干什么IW

private string OpmerkingenMethod(XmlNode node) 
{ 
    //Do something with XmlNode Opmerkingen 
    var something = node.Name //Or whatever you want from Opmerkingen node 
    return something 
} 

这可能是沿着你想要的线条多,再次我还没有测试的代码到底是什么,这只是证明代码做你想做的事。

private string OpmerkingenMethod(XmlNode node) 
{ 
    //Do something with XmlNode Opmerkingen 
    var child = node.FistChild; 

    if(child.name == "Opmerking") 
    { 
      return child.InnerText // or whatever you want 
    } 
    else { return "" ; } 

} 

,你可以调用Opmerkingen的情况下,这种方法并检查输出,如果这是你想要什么,breakswitch声明,如果这不是你想要的(因为没有附注或某事),你可以continue到下一个案例,或break转到nodelist中的下一个节点。同样,重点在于当您看到Opmerkingen时调用该方法,以便您可以获取Opmerkingen中的节点或值。

+0

你的意思是这样的吗? 案例“Opmerkingen”:案例“Opmerking”:var texeliseeneiland? – Djeroen

+0

是的,在“Opmerkingen”的情况下,你会调用一个方法来获取当前节点,并且在该方法中,您会看到Opmerkingen节点是否在其中存在Opmerking,并且可以使用Opmerking进行任何操作。我会编辑我的帖子,使其更清楚。 – wtyneb

+0

请记住,如果你喜欢我的回答,请立即投票,或者检查它是否是你想要的。当然,如果我错了,不要这样做! 我只想建立我的代表更多一点。 – wtyneb

2

最简单但不是最优雅的解决方案是从“Opmerkingen”节点列表中提取子节点:

case "Opmerkingen": 
{ 
    XmlNodeList nodeListOp = nodelist2.SelectNodes("Opmerking"); 
    foreach (XmlNode node in nodeListOp) 
    { 
     if (node.Name == "Opmerking") 
     { 
      // your "Opmerking" stuff here 
     } 
    } 
    break; 
}