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