Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Парсинг xml файла

Ответить
Настройки темы
PowerShell - [решено] Парсинг xml файла

Старожил


Сообщения: 227
Благодарности: 21

Профиль | Отправить PM | Цитировать


Всем добрый вечер!
Имеется телепрограмма в формате 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,Первый Балтийский Эстония
...
Но это всё можно уже потом сделать заменами... А как добавить в таблицу ссылку на лого ? Подскажите, пожалуйста, кто в этой теме.

Отправлено: 20:48, 03-03-2020

 

Старожил


Сообщения: 227
Благодарности: 21

Профиль | Отправить PM | Цитировать


Получилось вытащить ссылки на лого, хотя и немного "криво":
Код: Выделить весь код
$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
А дальше тупик, как получить формат, указанный в сабже, не могу сообразить...

Отправлено: 09:43, 04-03-2020 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Новый участник


Сообщения: 6
Благодарности: 3

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
[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

} 
}
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:05, 04-03-2020 | #3


Старожил


Сообщения: 227
Благодарности: 21

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 12:25, 04-03-2020 | #4



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Парсинг xml файла

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
PowerShell - парсинг xml firstarey Скриптовые языки администрирования Windows 4 31-12-2014 13:37
PowerShell - [решено] парсинг xml firstarey Скриптовые языки администрирования Windows 2 17-04-2014 14:25
CMD/BAT - [решено] парсинг xml :) firstarey Скриптовые языки администрирования Windows 10 07-03-2014 12:52
CMD/BAT - Парсинг XML/TXT mxm199 Скриптовые языки администрирования Windows 10 17-07-2012 12:34
PowerShell - [решено] парсинг XML файла dosperados Скриптовые языки администрирования Windows 2 02-07-2012 21:02




 
Переход