2010-05-24 139 views
1

嘿,我剛剛在VB.net上解析XML。這是我使用解析XML文件,我的代碼:VB.NET XML解析器循環

Dim output As StringBuilder = New StringBuilder() 

Dim xmlString As String = _ 
    "<ip_list>" & _ 
     "<ip>" & _ 
      "<ip>192.168.1.1</ip>" & _ 
      "<ping>9 ms</ping>" & _ 
      "<hostname>N/A</hostname>" & _ 
     "</ip>" & _ 
     "<ip>" & _ 
      "<ip>192.168.1.6</ip>" & _ 
      "<ping>0 ms</ping>" & _ 
      "<hostname>N/A</hostname>" & _ 
     "</ip>" & _ 
    "</ip_list>" 

Using reader As XmlReader = XmlReader.Create(New StringReader(xmlString)) 
     'reader.ReadStartElement("ip_list") 

     Do Until reader.EOF 
      reader.ReadStartElement("ip_list") 
      reader.ReadStartElement("ip") 
      reader.ReadStartElement("ip") 
      reader.MoveToFirstAttribute() 

      Dim theIP As String = reader.Value.ToString 
      reader.ReadToFollowing("ping") 
      Dim thePing As String = reader.ReadElementContentAsString().ToString 
      reader.ReadToFollowing("hostname") 
      Dim theHN As String = reader.ReadElementContentAsString().ToString 

      MsgBox(theIP & " " & thePing & " " & theHN) 
      reader.ReadEndElement() 
     Loop 

     reader.Close() 
    End Using 

我把自己do until reader.EOF但它似乎並沒有工作。在第一次出現後,它會一直給出錯誤。我肯定錯過了什麼?

大衛

+0

你會得到什麼錯誤? – SLaks 2010-05-24 16:43:28

回答

1

你永遠不會關閉第一<ip>元素。
因此,當循環重複時,它會嘗試讀取第一個內部的第二個<ip>

您需要在循環結束時調用ReadEndElement()兩次。

+0

感謝您的評論。我在最後添加了兩次,但似乎不再循環(只做一次) – StealthRT 2010-05-24 16:53:31

+0

嘗試只調用一次。 – SLaks 2010-05-24 17:00:20

+0

是的,試過了,它仍然只顯示一個而不是2.給出了和以前一樣的錯誤。 – StealthRT 2010-05-24 17:01:52

1

如果您能夠使用.NET 3.5,我會推薦使用XML文字和LINQ語法。

Dim ips = From xe In XElement.Parse(xmlString).<ip> _ 
      Select New With {.IP = xe.<ip>.Value, _ 
          .Ping = xe.<ping>.Value, _ 
          .HostName = xe.<hostname>.Value} 
'if you only want one 
Dim firstIp = ips.First() 

還有一個XElement.Load可以用來從文件加載。