2016-12-22 11 views
1

HTMLAgilityPackを使用してタグ内の値を取得する方法はありますか? 私の変数dataNodeHtmlAgilityPack.HtmlNodeで、含まれていますVB .NET HTMLAgilityPackコロン区切り値

Dim doc as New HtmlAgilityPack.HtmlDocument() 

doc.LoadHtml(" 
<div id="container" data="id:12,country:usa,city:oregon,id:13,country:usa,city:atlanta"> 
    <a href="http://www.google.com">Google</a> 
</div> 
") 

city、各idcountryの値を取得したいと思います。タグ内で繰り返し、異なる値を持ちます。

Dim dataNode as HtmlAgililtyPack.HtmlNode 

dataNode = doc.documentNode.SelectSingleNode("//div") 
txtbox.text = dataNode.Attributes("id[1]").value 

これは、あなたが"data"属性ではなく、"id"属性を必要とエラーにSystem.NullReferenceException

+0

Hello:D Im現在コードをテストしていますが、このコードをテストしています。https://dotnetfiddle.net/DI3N6p –

+0

Im完了したら回答を投稿します –

+0

あなたの投稿を編集できますか?あなたの目標出力は何ですか? –

答えて

0

を与えます。

あなたは正しい属性の値を持っていたら、例えば、データの各部分を保持するのに適したいくつかのデータ構造にそれを解析する必要があります。

Option Infer On 
Option Strict On 

Module Module1 

    Public Class LocationDatum 
     Property ID As Integer 
     Property Country As String 
     Property City As String 

     Public Overrides Function ToString() As String 
      Return $"ID={ID}, Country={Country}, City={City}" 
     End Function 

    End Class 


    Sub Main() 
     Dim doc As New HtmlAgilityPack.HtmlDocument() 

     doc.LoadHtml(" 
<div id=""container"" data=""id:12,country:usa,city:oregon,id:13,country:usa,city:atlanta""> 
    <a href=""http://www.google.com"">Google</a> 
</div> 
") 

     Dim dataNode = doc.DocumentNode.SelectSingleNode("//div") 
     Dim rawData = dataNode.Attributes("data").Value 
     Dim dataParts = rawData.Split(","c) 

     Dim locationData As New List(Of LocationDatum) 

     ' A simple way of parsing the data 
     For i = 0 To dataParts.Count - 1 Step 3 
      If i + 2 < dataParts.Count Then 
       Dim id As Integer = -1 
       Dim country As String = "" 
       Dim city As String = "" 
       ' used to check all three required parts have been found: 
       Dim partsFoundFlags = 0 
       For j = 0 To 2 
        Dim itemParts = dataParts(i + j).Split(":"c) 
        Select Case itemParts(0) 
         Case "id" 
          id = CInt(itemParts(1)) 
          partsFoundFlags = partsFoundFlags Or 1 
         Case "country" 
          country = itemParts(1) 
          partsFoundFlags = partsFoundFlags Or 2 
         Case "city" 
          city = itemParts(1) 
          partsFoundFlags = partsFoundFlags Or 4 
        End Select 
       Next 
       If partsFoundFlags = 7 Then 
        locationData.Add(New LocationDatum With {.ID = id, .Country = country, .City = city}) 
       End If 
      End If 

     Next 

     For Each d In locationData 
      Console.WriteLine(d) 
     Next 

     Console.ReadLine() 

    End Sub 

End Module 

出力:

ID = 12、国=アメリカ、市=オレゴン
ID = 13、国=アメリカ、市=アトランタ

それid/city/countryの順番が違うなどのデータの奇形や最後に偽のデータに耐性があります。

もちろん、解析コードを独自の関数に入れることもできます。

関連する問題