簡體   English   中英

解析VB中列出的XML項目

[英]Parsing XML items listed in VB

我想從我指定的xml feed鏈接中獲取每個項目。 這是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> ,它都有自己的標題,描述和頁面鏈接。

我希望標題保留在TextBox 1中,TextBox 2中的鏈接,Tex​​tBox 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文件的工作原理,所以我認為這里的錯誤是在atom部分附近。

我想要的是讀取XML文件,然后將每個itemTITLELINKDESCRIPTION在文本文件中。

TITLE:LINK:DESCRIPTION
每行一項。 我上面的示例RSS可以進行2行。

我發現了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:link:Description

您可以使用readalllines函數,然后通過':'分隔文本。 這是ac#代碼,用於分隔我為舊程序編寫的代碼,

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中指定它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM