Member 12296756 Ответов: 1

Как мне разобрать XML-данные в listbox и многое другое..(в VB.NET)


я работаю над программой, которая позволяет пользователям воспроизводить P2P-потоки (sopcast). Я хочу сделать свой список телепрограмм с помощью XML и списка.

Как я могу прочитать все каналы из XML? и я хочу, если я нажму программу в списке, чтобы получить другую информацию о ней и воспроизвести URL-адрес в WMP Control

Это XML-файл[^]:

<channels>
  <channel id="1">
    <name>TVR1</name>
    <protocol>Acestream</protocol>
    <quality>720p</quality>
    <url>http://tvr1</url>
  </channel>
  <channel id="2">
    <name>Antena 1</name>
    <protocol>Sopcast</protocol>
    <quality>4k</quality>
    <url>http://antena1</url>
  </channel>
  <channel id="3">
    <name>Kanal D</name>
    <protocol>Standard</protocol>
    <quality>TEEEST</quality>
    <url>http://kanald</url>
  </channel>
  <channel id="4">
    <name>Radio Pro FM</name>
    <protocol>FMTr</protocol>
    <quality>hd</quality>
    <url>radio</url>
  </channel>
</channels>




Смотри: http://p2ptv.ml/preview/chlist.png[^]

Я могу читать все каналы (в XML), но я хочу, когда я нажимаю случайный канал, чтобы получить на 3 метки всю остальную информацию о выбранном канале (< protocol>, < quality > и < url & gt;), Как я могу получить это без записи всех каналов в коде? Я хочу добавлять / удалять каналы только по XML, а не по коду.

Извините за мой плохой английский, но я все еще учу английский.
если вы чего-то не понимаете, пожалуйста, скажите мне.

Что я уже пробовал:

Я попытался разобрать все каналы, вызванные < name > В XML.
Это сработало, но я не знаю, как получить другую информацию, когда я нажимаю на канал в элементе управления ListBox, например "протокол", "качество" и "url".

Maciej Los

"Я хочу добавить / удалить каналы Только по XML, а не по коду- ...Не совсем понимаю, что ты имеешь в виду...

Member 12296756

я не хочу, чтобы так сохранялись каналы в моем коде проекта.
мне нужен код, который автоматически определяет количество каналов.
я понял это, но не знаю, как получить остальную информацию о выбранном канале в списке

1 Ответов

Рейтинг:
8

Maciej Los

Есть несколько способов добиться этого с помощью кода:

1)
Лучший вариант для вас-использовать пользовательский класс plus Сериализация/Десериализация Xml[^]:
Полный образец сериализации и десериализации пользовательских коллекций классов[^]
Сериализация и десериализация XML: Часть 1[^]
Сериализация и десериализация XML: Часть 2[^]

2)
Другой вариант-использовать Linq to XML[^].

Dim xcontent As String = "<channels>" & _
	"  <channel id='1'>" & _
	"    <name>TVR1</name>" & _
	"    <protocol>Acestream</protocol>" & _
	"    <quality>720p</quality>" & _
	"    <url>http://tvr1</url>" & _
	"  </channel>" & _
	"  <channel id='2'>" & _
	"    <name>Antena 1</name>" & _
	"    <protocol>Sopcast</protocol>" & _
	"    <quality>4k</quality>" & _
	"    <url>http://antena1</url>" & _
	"  </channel>" & _
	"  <channel id='3'>" & _
	"    <name>Kanal D</name>" & _
	"    <protocol>Standard</protocol>" & _
	"    <quality>TEEEST</quality>" & _
	"    <url>http://kanald</url>" & _
	"  </channel>" & _
	"  <channel id='4'>" & _
	"    <name>Radio Pro FM</name>" & _
	"    <protocol>FMTr</protocol>" & _
	"    <quality>hd</quality>" & _
	"    <url>radio</url>" & _
	"  </channel>" & _
	"</channels>"

	Dim xdoc As XDocument = XDocument.Parse(xcontent)
	
	Dim chanel2find = "TVR1"
	
	Dim result = xdoc.Descendants("channel") _
					.Where(Function(x) x.Element("name") = chanel2find) _
					.Select(Function(x) New With _
						{ _
							.id = x.Attribute("id").Value, _
							.name = x.Element("name").Value, _
							.protocol = x.Element("protocol").Value, _
							.quality = x.Element("quality").Value, _
							.url = x.Element("url").Value _
						}) _
					.SingleOrDefault()
	Console.WriteLine("{0}", result.protocol)


3)
Другой вариант-использовать пользовательский класс + Linq to XML:
определение класса:
Public Class Channel
	Private iid As Integer = 0
	Private sname As String = String.Empty
	Private sprotocol As String = String.Empty
	Private squality As String = String.Empty
	Private surl As String = String.Empty
	
	Public Sub New
		'default constructor
	End Sub
	
	Public Sub New (ByVal _id As Integer, ByVal _nam As String, ByVal _prot As String, _
					ByVal _qty As String, ByVal _url As String)
		iid = _id
		sname = _nam
		sprotocol = _prot
		squality = _qty
		surl = _url
	End Sub
	
	Public Property ID As Integer
		Get
			Return iid
		End Get
		Set (value As Integer)
			iid = value
		End Set
	End Property

	Public Property Name As String
		Get
			Return sname
		End Get
		Set (value As String)
			sname = value
		End Set
	End Property

	Public Property Protocol As String
		Get
			Return sprotocol
		End Get
		Set (value As String)
			sprotocol = value
		End Set
	End Property

	Public Property Quality As String
		Get
			Return squality
		End Get
		Set (value As String)
			squality = value
		End Set
	End Property

	Public Property Url As String
		Get
			Return surl
		End Get
		Set (value As String)
			surl = value
		End Set
	End Property
	
End Class


Использование:
'load data from xml to list of channels
	Dim channels As List(Of Channel) =  New List(Of Channel)
	channels = xdoc.Descendants("channel") _
					.Select(Function(x) New Channel With _
						{ _
							.ID = x.Attribute("id").Value, _
							.Name = x.Element("name").Value, _
							.Protocol = x.Element("protocol").Value, _
							.Quality = x.Element("quality").Value, _
							.Url = x.Element("url").Value _
						}) _
					.ToList()
        'get single channel 
	Dim c As Channel = channels.Cast(Of Channel) _
			.Where(Function(x) x.Name = channel2find) _
			.SingleOrDefault()
	'display name and protocol		
	Console.WriteLine("{0} -> {1}", c.Name, c.Protocol)


Попробуй!
Удачи!


Member 12296756

код работает, но как я могу сделать это в windows forms ?

Maciej Los

Точно так же, как он используется в консольном приложении. Вместо Console.WriteLine("{0} -> {1}", c.Name, c.Protocol), использовать Me.TextBox1.Text = c.Protocol

Member 12296756

ладно. сейчас я попробую.
спасибо.

Member 12296756

но ... есть одна проблема.
я пытаюсь получить информацию, когда нажимаю на элемент в списке.
я изменил Дим channel2find = "телеканалу tvr1" в Дим channel2find = channelsList.Элемент, но я получаю сообщение об ошибке.

Member 12296756

я исправил это, добавив функцию Dim в SelectedChangeIndex списка
он отлично работает.
спасибо, парень!
я поставлю кредиты на это исправление в своей программе!!

Maciej Los

Я очень рад, что могу вам помочь. Можете ли вы принять мой ответ (зеленая кнопка), чтобы удалить свой вопрос из списка без ответа?

Member 12296756

Сделано;)

Member 12296756

еще один вопрос-как я могу использовать URL вместо копирования XML непосредственно в коде?

Maciej Los

Это зависит от многих факторов. Хранится ли xml-файл локально или вы получаете к нему доступ через сервис?

Member 12296756

Я хочу получить доступ к нему с веб-сайта.
http://p2ptv.ml/preview/ro_channels.xml - это url-адрес XML-файла

Maciej Los

Воспользуйся WebRequest:
Dim myUrl As String = "http://p2ptv.ml/preview/ro_channels.xml"
Dim request = WebRequest.Create(myUrl)
request.Timeout = 5000
Dim response = request.GetResponse()

Using stream = response.GetResponseStream()
Dim xdoc = XDocument.Load(stream)
'now you can use xdoc variable
End Using


Подробнее здесь: http://stackoverflow.com/questions/6783697/how-do-i-read-xml-from-internet-in-visual-basic-net

Member 12296756

я получаю декларацию, ожидаемую с помощью этого кода & gt; запроса.Тайм-аут = 5000

Member 12296756

ну, я удалил его, и теперь он работает нормально.
Спасибо!