Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Извлечь необходимую информацию из .xml, сгруппировать и записать ее в *.txt (http://forum.oszone.net/showthread.php?t=343305)

temphard 16-12-2019 11:55 2900670

Извлечь необходимую информацию из .xml, сгруппировать и записать ее в *.txt
 
Вложений: 1
Всем привет.
Обычно я использую скрипт 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 2900686

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 2900691

Цитата 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 2900698

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

temphard 16-12-2019 14:50 2900702

Цитата:

Цитата DJ Mogarych
поправил выше »

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


Время: 20:54.

Время: 20:54.
© OSzone.net 2001-