2014-06-21 84 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; 
}