2014-09-19 35 views
1

我想從我指定的xml供稿鏈接中獲取每個項目。這裏是XML格式,解析VB中列出的XML項目

<?xml version="1.0" encoding="UTF-8"?> 
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"> 
    <channel> 
     <title>Site title</title> 
     <link>http://www.blahblah.com</link> 
     <language>ru</language> 
     <description>This site rocks</description> 
     <generator>DataLife Engine</generator> 
     <item> 
     <title>Item no 1 title</title> 
     <guid isPermaLink="true">http://www.blahblah.com/item1</guid> 
     <link>http://www.blahblah.com/item1</link> 
     <description>Description of item 1</description> 
     <category>Category 0</category> 
     <dc:creator>admin</dc:creator> 
     <pubDate>Fri, 19 Sep 2014 08:00:00 +0000</pubDate> 
     </item> 
     <item> 
     <title>Item no 2 title</title> 
     <guid isPermaLink="true">http://www.blahblah.com/item2</guid> 
     <link>http://www.blahblah.com/item2</link> 
     <description>Description of item 2</description> 
     <category>Category 0</category> 
     <dc:creator>admin</dc:creator> 
     <pubDate>Fri, 19 Sep 2014 07:00:00 +0000</pubDate> 
     </item> 
    </channel> 
</rss> 

以下是飼料中的示例項目。對於每個<item></item>,它都有自己的標題,說明和鏈接。

我希望將標題保留在文本框1中,鏈接到文本框2中,並在文本框3中僅對第一項進行描述。

大多數情況下,我希望將它們保存爲字符串,以便我可以繼續使用這些字符串的代碼。

任何人都可以幫助我嗎?

我已經試過這樣的事情:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    File.Delete(paths) 
    If Not File.Exists(paths) Then 
     File.Create(paths).Dispose() 
    End If 

    Dim Lines() As String 
    Dim stringSeparators() As String = {vbCrLf} 
    Dim Source As String 
    Dim wc As New WebClient 
    Source = wc.DownloadString("http://blahblah.com/rss.xml") 
    File.WriteAllText(paths, Source) 

    xDoc.Load(paths) 

    Dim manager As XmlNamespaceManager = New XmlNamespaceManager(xDoc.NameTable) 
    manager.AddNamespace("atom", "http://www.w3.org/2005/Atom") 

    Dim xnList As XmlNodeList = xDoc.SelectNodes("atom:feed/atom:entry", manager) 

    For Each xn As XmlNode In xnList 
     TextBox1.Text = xn.LocalName.ToString() + vbCrLf 
    Next 
End Sub 

這樣一來,我已成功地下載整個文件,並將其保存爲字符串。但是我不能完成最後一部分。我不明白xml文件是如何工作的,所以我認爲這裏的錯誤在原子部分附近。

我想什麼是讀取XML文件,然後保存每個itemTITLELINKDESCRIPTION在文本文件中。

like,TITLE:LINK:DESCRIPTION
每行一個項目。我上面的示例RSS可以製作2行。

+0

只是爲了驗證,我想元素,標題,描述和鏈接在字符串中。否則無關緊要。 – kks21199 2014-09-19 08:19:25

+0

和傢伙,我有一個解決方案。如果你允許我,我會發布它。 – kks21199 2014-09-19 15:46:44

回答

0

我找到了2種不同的解決方案。

Imports System.IO 
Imports System.Xml 
Imports System.Net 



Public Class Form1 
    WithEvents bs As New BindingSource 
    Dim paths As String = Application.StartupPath + "/eeeror.log" 
    Dim source As String = File.ReadAllText(paths) 
    Dim paths1 As String = Application.StartupPath + "/123.log" 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

     File.Delete(paths1) 
     If Not File.Exists(paths1) Then 
      File.Create(paths1).Dispose() 
     End If 

     Dim ds As New DataSet 
     Dim sr As System.IO.StringReader = New System.IO.StringReader(source) 
     ds.ReadXml(sr, XmlReadMode.InferSchema) 
     bs.DataSource = 
      (
       From T In ds.Tables("item") 
       Select New Item With 
         { 
          .Description = T.Field(Of String)("description").Trim, 
          .Link = T.Field(Of String)("link").Trim, 
          .Title = T.Field(Of String)("title").Trim 
         } 
      ).ToList 

     For Each i As Item In bs 
     Next 
     ds = Nothing 
    End Sub 


    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 
     Dim intITEMS As Integer = -1 'starting at -1 as array can work with (0) 
     For Each itemint As Item In bs 
      intITEMS += 1 
      MsgBox(intITEMS.ToString) 
      Dim item As Item = CType(bs.Item(intITEMS), Item) 
      File.AppendAllText(paths1, item.Title + ":" + item.Link + ":" + item.Description + vbCrLf) 
     Next 


    End Sub 
End Class 

Public Class Item 
    Public Property Title As String 
    Public Property Link As String 
    Public Property Description As String 
    Public Sub New() 
    End Sub 
    Public Overrides Function ToString() As String 
     Return String.Concat(Title, ", ", Description, ", ", Link) 
    End Function 
End Class 

這樣,你就可以得到123.log文件中的行數= rss中的項目。不會有錯誤。

Imports System.IO 
Imports System.Xml 
Imports System.Net 
Imports System.Text.RegularExpressions 


Public Class Form1 

    Dim paths As String = Application.StartupPath + "/eeeror.log" 
    Dim source As String = File.ReadAllText(paths) 
    Dim paths1 As String = Application.StartupPath + "/123.log" 


    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

     File.Delete(paths1) 
     If Not File.Exists(paths1) Then 
      File.Create(paths1).Dispose() 
     End If 


       Dim xmlString As String = My.Computer.FileSystem.ReadAllText(paths) 

     Using reader As XmlReader = XmlReader.Create(New StringReader(xmlString)) 


      Dim itemcount As Integer = Regex.Matches(source, "<item>").Count 

      For i As Integer = 1 To itemcount + 1 '+1 because number <items> tag + with the title as it was included, this prevents craching 

       Dim title As String = "" 
       Dim link As String = "" 
       Dim description As String = "" 
       reader.ReadToFollowing("title") 
       title = reader.ReadElementContentAsString 

       reader.ReadToFollowing("link") 
       link = reader.ReadElementContentAsString 

       reader.ReadToFollowing("description") 
       description = reader.ReadElementContentAsString 


       File.AppendAllText(paths1, title + ":" + link + ":" + description + vbCrLf) 
      Next 

     End Using 
    End Sub 

End Class 

這將會給你,123.log =項目+ 1的數,因爲它也計算該項目的標題,描述,鏈接。它不是那麼可靠,當你正在尋找更多不同的元素,因爲一些元素可能不會在那裏11次,它可能會拋出錯誤以及混淆數據

你會得到這種格式的數據, title:鏈接:說明

您可以使用readalllines函數,然後通過':'分隔文本。下面是分離的C#代碼,我寫了我的老節目,

string[] strArray = File.ReadAllLines(proxyDB); 
       int num = 0; 

       if (strArray.Length >= 1) 
       { 
        this.proxy_list = new string[strArray.Length]; 
        foreach (string str in strArray) 
        { 
         string[] strArray3 = str.Split(new char[] { ':' }); 
         this.proxy_list[num++] = str; 
         string proxy = strArray3(0) 
         string pass = strArray3(1) 

        } 
       } 

這樣你就可以在列表視圖指定它們,或者反正你想要的foreach內。