2016-12-22 2 views
1

Есть ли способ получить значения в теге с помощью HTMLAgilityPack? Моя переменная dataNode является HtmlAgilityPack.HtmlNode и содержит:VB .NET HTMLAgilityPack Colon Separated Values ​​

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> 
") 

Хотелось бы, чтобы получить значение каждого id, country, city. Они повторяются внутри тега и имеют разные значения.

Dim dataNode as HtmlAgililtyPack.HtmlNode 

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

Это дает ошибку System.NullReferenceException

+0

Здравствуйте: D В настоящее время я проверяю ваш код, посмотрим на этот хе-хе https://dotnetfiddle.net/DI3N6p –

+0

Если я сделал, я отправлю ответ –

+0

Можете ли вы отредактировать свой пост? Каков ваш целевой результат? –

ответ

0

Вам нужен атрибут "data", а не атрибут "id".

После того, как у вас есть значение правильного атрибута, вам нужно будет разобрать его в какую-то структуру данных, подходящий для проведения каждой части данных, например:

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, Страна = США, Город = атлант

It устойчив к Некоторым порокам развития, таким как id/city/country, находятся в другом порядке и ложные данные в конце.

Вы бы, конечно, поместили код анализа в свою собственную функцию.

Смежные вопросы