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

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

Ответить
Настройки темы
Любой язык - [решено] Извлечь необходимую информацию из .xml, сгруппировать и записать ее в *.txt

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


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

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


Изменения
Автор: temphard
Дата: 16-12-2019
Описание: Язык программирования не принципиален
Вложения
Тип файла: zip xml.zip
(437.9 Kb, 2 просмотров)
Всем привет.
Обычно я использую скрипт VBS, который извлекает все ссылки из .xml
Скрытый текст
Код: Выделить весь код
Option Explicit

Const strDestFile = "C:/sitemap.txt"


Dim strSourceFolder

Dim objFSO
Dim objTS
Dim objFile

Dim objXMLDOMSelection
Dim objXMLDOMElement


If WScript.Arguments.Count = 1 Then
    strSourceFolder = WScript.Arguments.Item(0)
    
    Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
    
    If objFSO.FolderExists(strSourceFolder) Then
        Set objTS = objFSO.CreateTextFile(strDestFile, True)
        
        With WScript.CreateObject("Microsoft.XMLDOM")
            For Each objFile In objFSO.GetFolder(strSourceFolder).Files
                If StrComp(objFSO.GetExtensionName(objFile.Name), "xml", vbTextCompare) = 0 Then
                    .load objFile.Path
                    
                    Set objXMLDOMSelection = .selectNodes("/urlset/url/loc")
                    
                    If Not objXMLDOMSelection Is Nothing Then
                        For Each objXMLDOMElement In objXMLDOMSelection
                            objTS.WriteLine objXMLDOMElement.text
                        Next
                    End If
                    
                    Set objXMLDOMSelection = Nothing
                End If
            Next
        End With
        
        objTS.Close
        Set objTS = Nothing
    Else
        WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
        WScript.Quit 2
    End If
    
    Set objFSO = Nothing
Else
    WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source folder>"
    WScript.Quit 1
End If

WScript.Quit 0

Во первых данный скрипт извлекает ВСЕ ссылки, а меня интересуют только те, в которых есть */item/*. В последствии приходится очищать результат от множества других не нужных ссылок.
Но теперь необходимо получить чуть больше информации.
Вот структура файла .xml Здесь показан только один "блок" <url>, в котором расположена нужная информация, а таких блоков множество. (Оригинальный файл прилагается xml.zip)
Скрытый текст
Код: Выделить весь код
- <url>
  <loc>https://videohive.net/item/on-pottery-master-makes-notes-for-attaching-the-handle-to-the-cup/21998412</loc> 
  <lastmod>2018-07-19</lastmod> 
  <changefreq>weekly</changefreq> 
  <priority>0.8</priority> 
- <video:video>
  <video:thumbnail_loc>https://s3.envato.com/files/247514118/preview.jpg</video:thumbnail_loc> 
  <video:title>On Pottery Master Makes Notes for Attaching the Handle To the Cup</video:title> 
  <video:description>On pottery master makes notes for attaching the handle to the cup. Male craftsman in an apron with brush makes marking on raw product in order to make ceramic mug for drinking with convenient holder.</video:description> 
  <video:content_loc>https://s3.envato.com/h264-video-previews/38cb69c7-64ca-4977-ba3c-ec1375432f4a/21998412.mp4</video:content_loc> 
  <video:rating>0.00</video:rating> 
  <video:publication_date>2018-07-19T21:42:51+10:00</video:publication_date> 
  <video:tag>art</video:tag> 
  <video:tag>ceramist</video:tag> 
  <video:tag>clay</video:tag> 
  <video:tag>concept</video:tag> 
  <video:tag>craftsman</video:tag> 
  <video:tag>cup</video:tag> 
  <video:tag>design</video:tag> 
  <video:tag>handle</video:tag> 
  <video:tag>master</video:tag> 
  <video:tag>potter</video:tag> 
  <video:tag>pottery</video:tag> 
  <video:tag>raw</video:tag> 
  <video:tag>tool</video:tag> 
  <video:tag>work</video:tag> 
  <video:tag>workshop</video:tag> 
  <video:price currency="USD">27.00</video:price> 
  <video:uploader>https://themeforest.net/user/Daria_Kozyreva/profile</video:uploader> 
  </video:video>
  </url>

Необходимо извлечь и записать в файл *.txt информацию в таком виде и последовательности:
Скрытый текст
Код: Выделить весь код
<video:title>On Pottery Master Makes Notes for Attaching the Handle To the Cup</video:title>
<video:thumbnail_loc>https://s3.envato.com/files/247514118/preview.jpg</video:thumbnail_loc>
<video:content_loc>https://s3.envato.com/h264-video-previews/38cb69c7-64ca-4977-ba3c-ec1375432f4a/21998412.mp4</video:content_loc>
<loc>https://videohive.net/item/on-pottery-master-makes-notes-for-attaching-the-handle-to-the-cup/21998412</loc>
<video:uploader>https://themeforest.net/user/Daria_Kozyreva/profile</video:uploader>
<video:description>On pottery master makes notes for attaching the handle to the cup. Male craftsman in an apron with brush makes marking on raw product in order to make ceramic mug for drinking with convenient holder.</video:description>
<video:publication_date>2018-07-19T21:42:51+10:00</video:publication_date>
<video:uploader>https://themeforest.net/user/Daria_Kozyreva/profile</video:uploader>
<loc>https://videohive.net/item/on-pottery-master-makes-notes-for-attaching-the-handle-to-the-cup/21998412</loc>
----------

1) В файле *.txt некоторые строки дублируются - это не ошибка, так должно быть.
2) В конце желательно поставить ----------, который разделял бы информацию по "блокам".
3) Если некоторых данных в .xml не существует, скрипт должен продолжать работать, просто игнорируя это, но и пустых строк создавать в файле *.txt не надо.
Возможно ли такое реализовать на VBS? Мне не принципиально VBS, можно и PowerShell и CMD/BAT, хотя последний вариант скорее всего будет работать медленно, а хочется чтобы скрипт работал быстро.
Буду рад любой помощи.

Отправлено: 11:55, 16-12-2019

 

Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


Powershell:
Код: Выделить весь код
[xml]$xml = (gc "D:\temp\xml\xml.xml") -match "\w" -join " " -replace "\s+"," "
$result = foreach ($item in $xml.urlset.url) {
    if ($item.loc -match "/item/" -and $item.video.thumbnail_loc -and $item.video.content_loc) {
    "<video:title>$($item.video.title)</video:title>"
    "<video:thumbnail_loc>$($item.video.thumbnail_loc)</video:thumbnail_loc>"
    "<video:content_loc>$($item.video.content_loc)</video:content_loc>"
    "<loc>$($item.loc)</loc>"
    "<video:uploader>$($item.video.uploader)</video:uploader>"
    "<video:description>$($item.video.description)</video:description>"
    "<video:publication_date>$($item.video.publication_date)</video:publication_date>"
    "<video:uploader>$($item.video.uploader)</video:uploader>"
    "<loc>$($item.loc)</loc>"
    "----------"
    }
}
$result |Out-File "D:\temp\xml\result.txt" -Encoding utf8

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Последний раз редактировалось DJ Mogarych, 16-12-2019 в 14:30.

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

Отправлено: 13:22, 16-12-2019 | #2



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

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


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


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

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


Цитата DJ Mogarych:
Powershell: »
Шикарно! И работает очень быстро!
Такой вопрос: Можно ли указать, что если между определенными тегами не содержится ссылки, то чтобы весь блок URL пропускался (игнорировался)?

Например здесь между тегами есть ссылки (они и должны там всегда быть)
Код: Выделить весь код
<video:thumbnail_loc>https://s3.envato.com/files/247514118/preview.jpg</video:thumbnail_loc>
<video:content_loc>https://s3.envato.com/h264-video-previews/38cb69c7-64ca-4977-ba3c-ec1375432f4a/21998412.mp4</video:content_loc>
Но быват, что между тегами нет ссылок, поэтому весь блок информации бесполезен и не должен записываться в конечный файл
Код: Выделить весь код
<video:thumbnail_loc></video:thumbnail_loc>
<video:content_loc></video:content_loc>
Два тега <video:content_loc> и <video:thumbnail_loc> обязательны
Если в каких либо других тегах пусто, то это не проблема, блок должен записываться.

Последний раз редактировалось temphard, 16-12-2019 в 14:01.


Отправлено: 13:56, 16-12-2019 | #3


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


поправил выше

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 14:30, 16-12-2019 | #4


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


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

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


Цитата DJ Mogarych:
поправил выше »
Все работает, спасибо большое!

Последний раз редактировалось temphard, 16-12-2019 в 15:56.


Отправлено: 14:50, 16-12-2019 | #5



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Любой язык - Извлечь информацию из файлов .msg dahiko Скриптовые языки администрирования Windows 12 29-04-2021 15:07
CMD/BAT - Получение значении из XML и сохранение в txt sector2484 Скриптовые языки администрирования Windows 16 01-10-2018 12:42
Любой язык - Записать информацию о пользователях в AD из текстового файла. dasgespenst Скриптовые языки администрирования Windows 2 29-07-2014 09:53
CMD/BAT - [решено] Как записать информацию из буфера обмена в файл тхт батником? angel_lyucifer Скриптовые языки администрирования Windows 12 26-12-2012 17:22
Прочие БД - вытащить информацию из DBF файла и записать в TXT файлик garanov Программирование и базы данных 5 23-05-2012 12:45




 
Переход