简体   繁体   English

我如何阅读该XML部分?

[英]How can I read this XML part?

I have a link to a online XML file which I read in my application. 我有一个在线XML文件的链接,该文件在我的应用程序中读取。 This is a part of the 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>

I want to read the "Opmerking" which is listed in "Opmerkingen" and is standing in "VertrekkendeTrein": 我想阅读“ Opmerkingen”中列出的“ Opmerking”,它位于“ VertrekkendeTrein”中:

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

The problem is that it is not always there, it will depend of the situation. 问题在于它并不总是存在的,它取决于情况。

I can read the other parts like "RitNummer" and "Vervoerder", and i use the following code to do that: 我可以阅读其他部分,例如“ 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;


                   }


                }
           }

I tried a lot like: 我做了很多尝试:

case "Opmerking": var texeliseeneiland1 

and

case "Opmerkingen/Opmerking": var texeliseeneiland1 

Is there a way i can make a case for "Opmerking"? 有什么方法可以为“ Opmerking”辩护吗?

Thanks! 谢谢!

Simplest and not the most elegant solution is to extract child nodes from the "Opmerkingen" node list: 最简单但不是最优雅的解决方案是从“ Opmerkingen”节点列表中提取子节点:

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

You might try turning the XML node list/set into a queryable data structure, and use System.Linq to see if it contains and Opmerking. 您可以尝试将XML节点列表/集合转换为可查询的数据结构,并使用System.Linq来查看它是否包含和Opmerking。 Although that's my preference because I've been doing a lot of database queries. 尽管那是我的偏爱,因为我一直在进行很多数据库查询。

In your situation, with your switch statement and many cases, you might try the following: 在您的情况下,对于switch语句和许多情况,您可以尝试以下操作:

In the case for "Opmerkingen" nest another case to see if it has a child node "Opmerking", and than do something with that "Opmerking" node. 对于“ Opmerkingen”,嵌套另一个案例以查看其是否具有子节点“ Opmerking”,然后对该“ Opmerking”节点进行操作。 Or have the case "Opmerkingen" call a function to do something with the "opmerking" node. 或者让案例“ Opmerkingen”调用一个函数以对“ opmerking”节点进行操作。

Edit for an example: 编辑一个例子:

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


            }
       }

Here's an example of a method you might use in the case of Opmerkingen, so that you can get to Opmerking and do something with that. 这是在Opmerkingen情况下可能使用的方法的示例,以便您可以使用Opmerking并执行一些操作。 Again, I don't know what exactly you want to do iw 再说一次,我不知道你到底想做什么

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

This might be more along the lines of what you want, again I haven't tested the code, this is just to demonstrate the code that does what you want. 这可能更多地符合您想要的内容,同样,我还没有测试代码,这只是为了演示满足您需求的代码。

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 "" ; }

}

you could call this method in the case of Opmerkingen and check the output, if it's what you want, break the switch statement, if it's not what you want (because there's no opmerking or something) you could continue to the next case, or break to go to the next node in nodelist. 您可以在Opmerkingen的情况下调用此方法并检查输出,如果是您想要的,则break switch语句,如果不是您想要的(因为没有opmerking或其他东西),则可以continue进行下一种情况,或break转到节点列表中的下一个节点。 Again, the point is to call the method when you see Opmerkingen so that you can then get the node or value that's inside Opmerkingen 同样,关键是在看到Opmerkingen时调用该方法,以便可以获取Opmerkingen内部的节点或值。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM