解析VB中列出的XML项

时间:2014-09-19 06:23:06

标签: xml vb.net xml-parsing

我想从我指定的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>

以下是Feed中的示例项。对于每个<item></item>,它有自己的标题,描述和页面链接。

我希望标题保存在TextBox 1中,链接在TextBox 2中,而TextBox 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保存在文本文件中。

喜欢,TITLE:LINK:DESCRIPTION
 一行中每行一个。我上面的示例RSS可以生成2行。

1 个答案:

答案 0 :(得分:0)

我找到了两种不同的解决方案。

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次并且它可能会抛出错误以及混淆数据

您获得此格式的数据, 标题:链接:说明

您可以使用readalllines函数,然后通过&#39;:&#39;分隔文本。这是一个用于分离的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)

                    }
                }

这样你就可以在listview中指定它们,或者你想在foreach中指定它们。