Войти

Показать полную графическую версию : [решено] Парсинг xml файла


Uragan66
03-03-2020, 20:48
Всем добрый вечер!
Имеется телепрограмма в формате xml https://iptvx.one/EPG
Никак не получается распарсить xml до нужного формата...
Пример xml:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE tv SYSTEM "https://iptvx.one/xmltv.dtd">
<tv generator-info-name="IptvX.one" generator-info-url="https://iptvx.one/">
<channel id="no_epg"><display-name>NO EPG</display-name></channel>
<channel id="no_epg_cinema"><display-name>NO EPG Cinema</display-name></channel>
<channel id="no_epg_mult"><display-name>NO EPG Mult</display-name></channel>
<channel id="no_epg_music"><display-name>NO EPG Music</display-name></channel>
<channel id="no_epg_news"><display-name>NO EPG News</display-name></channel>
<channel id="no_epg_sport"><display-name>NO EPG Sport</display-name></channel>
<channel id="0x0-fireplace-hd"><display-name>Горящий камин</display-name><display-name>Ланет HOME</display-name><display-name>Lanet Home</display-name><display-name>0x0 Fireplace HD</display-name><icon src="https://iptvx.one/icn/kamin.png"/></channel>
<channel id="1-balt-ee"><display-name>PBK EE</display-name><display-name>PBK Эстония</display-name><display-name>Первый Балтийский канал Эстония</display-name><display-name>Первый Балтийский Эстония</display-name><icon src="https://iptvx.one/icn/1-balt.png"/></channel>
<channel id="1-balt-lt"><display-name>PBK LT</display-name><display-name>PBK Литва</display-name><display-name>Первый Балтийский канал Литва</display-name><display-name>Первый Балтийский Литва</display-name><icon src="https://iptvx.one/icn/1-balt.png"/></channel>
<channel id="1-balt-lv"><display-name>PBK LV</display-name><display-name>Pirmais Baltijas Kanāls</display-name><display-name>Первый Балтийский канал</display-name><display-name>Первый Балтийский</display-name><display-name>Первый Балтийский Латвия</display-name><icon src="https://iptvx.one/icn/1-balt.png"/></channel>
<channel id="1-music-hu"><display-name>1 Music Channel Hungary</display-name><icon src="https://iptvx.one/icn/1-music-hu.png"/></channel>
... и т.д.
</tv>

Таким кодом:
$a = Select-Xml -Path .\epg.xml -XPath //channel[@*]
$a.Node
получается таблица из id и привязанных к нему имён каналов, а ссылки на лого нет...

В идеале нужно получить 2 файла на выходе такого формата:
id.txt:
1-balt-ee,PBK EE
1-balt-ee,PBK Эстония
1-balt-ee,Первый Балтийский канал Эстония
1-balt-ee,Первый Балтийский Эстония
...

logo.txt:
https://iptvx.one/icn/1-balt.png,PBK EE
https://iptvx.one/icn/1-balt.png,PBK Эстония
https://iptvx.one/icn/1-balt.png,Первый Балтийский канал Эстония
https://iptvx.one/icn/1-balt.png,Первый Балтийский Эстония
...

Но это всё можно уже потом сделать заменами... А как добавить в таблицу ссылку на лого ? Подскажите, пожалуйста, кто в этой теме.

Uragan66
04-03-2020, 09:43
Получилось вытащить ссылки на лого, хотя и немного "криво":
$a = Select-Xml -Path .\epg.xml -XPath "//tv/channel"
$a.Node | ForEach {$_.id+','+$_.'display-name';$_.icon}
На выходе текст такого формата:
no_epg,NO EPG
no_epg_cinema,NO EPG Cinema
no_epg_mult,NO EPG Mult
no_epg_music,NO EPG Music
no_epg_news,NO EPG News
no_epg_sport,NO EPG Sport
0x0-fireplace-hd,Горящий камин Ланет HOME Lanet Home 0x0 Fireplace HD

src
---
https://iptvx.one/icn/kamin.png
1-balt-ee,PBK EE PBK Эстония Первый Балтийский канал Эстония Первый Балтийский Эстония
https://iptvx.one/icn/1-balt.png
1-balt-lt,PBK LT PBK Литва Первый Балтийский канал Литва Первый Балтийский Литва
https://iptvx.one/icn/1-balt.png
1-balt-lv,PBK LV Pirmais Baltijas Kanāls Первый Балтийский канал Первый Балтийский Первый Балтийский Латвия
https://iptvx.one/icn/1-balt.png

А дальше тупик, как получить формат, указанный в сабже, не могу сообразить...

AAT666
04-03-2020, 12:05
[xml] $xdoc = get-content "C:\temp\epg.xml" -Encoding utf8

$xdoc.SelectNodes("//channel") | %{

$cc = $_
$cc."display-name" | %{
Out-File c:\temp\id.txt -InputObject ($cc.id + ',' + $_) -Encoding UTF8 -Append
Out-File c:\temp\logo.txt -InputObject ($cc.icon.src + ',' + $_) -Encoding UTF8 -Append

}
}

Uragan66
04-03-2020, 12:25
AAT666, спасибо!
Но, к сожалению не работает такой код, ошибка:
Cannot convert value "System.Object[]" to type "System.Xml.XmlDocument". Error: "Невозможно вставить указанный узел в качестве действительного дочернего узла данного узл
а, т.к. указанный узел имеет неверный тип."
At line:1 char:1
+ [xml] $xdoc = get-content .\epg.xml. -Encoding utf8
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : MetadataError: (:) [], ArgumentTransformationMetadataException
+ FullyQualifiedErrorId : RuntimeException

You cannot call a method on a null-valued expression.
At line:3 char:1
+ $xdoc.SelectNodes("//channel") | %{
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

AAT666, немного переделал Ваш код, вот так работает отлично:
$a = Select-Xml -Path .\epg.xml -XPath "//tv/channel"
$a.Node | %{

$cc = $_
$cc."display-name" | %{
Out-File .\id.txt -InputObject ($cc.id + ',' + $_) -Encoding UTF8 -Append
Out-File .\logo.txt -InputObject ($cc.icon.src + ',' + $_) -Encoding UTF8 -Append

}
}

Спасибо большое за помощь!




© OSzone.net 2001-2012