Войти

Показать полную графическую версию : [решено] Извлечь необходимую информацию из .xml, сгруппировать и записать ее в *.txt


temphard
16-12-2019, 11:55
Всем привет.
Обычно я использую скрипт 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, хотя последний вариант скорее всего будет работать медленно, а хочется чтобы скрипт работал быстро.
Буду рад любой помощи.

DJ Mogarych
16-12-2019, 13:22
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

temphard
16-12-2019, 13:56
Цитата 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> обязательны
Если в каких либо других тегах пусто, то это не проблема, блок должен записываться.

DJ Mogarych
16-12-2019, 14:30
поправил выше

temphard
16-12-2019, 14:50
поправил выше »

Все работает, спасибо большое!




© OSzone.net 2001-2012