我该如何阅读这个XML部分?

时间:2014-06-21 15:00:18

标签: c# xml web

我有一个在线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>

我想阅读&#34; Opmerking&#34;列于&#34; Opmerkingen&#34;并且站在&#34; VertrekkendeTrein&#34;:

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

问题在于它并不总是存在,而是取决于具体情况。

我可以阅读其他部分,例如&#34; RitNummer&#34;和&#34; Vervoerder&#34;,我使用以下代码来做到这一点:

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 

我有没有办法为&#34; Opmerking&#34;?

提供案例

谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

在您的情况下,使用switch语句和许多情况,您可以尝试以下操作:

对于&#34; Opmerkingen&#34;嵌套另一个案例,看它是否有一个子节点&#34; Opmerking&#34;,而不是用那个&#34; Opmerking&#34;节点。或者有案例&#34; Opmerkingen&#34;调用函数来执行&#34; opmerking&#34;节点

编辑示例:

   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案例中使用的方法的例子,这样你就可以进入Opmerking并做一些事情。再一次,我不知道你到底想要做什么

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的情况下调用这个方法并检查输出,如果它是你想要的,break switch语句,如果它不是你的意思想要(因为没有opmerking或其他东西)你可以continue到下一个案例,或者break转到nodelist中的下一个节点。同样,重点是当您看到Opmerkingen时调用该方法,以便您可以获得Opmerkingen中的节点或值