Компьютерный форум 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=336928)

sector2484 29-09-2018 22:24 2833561

Получение значении из XML и сохранение в txt
 
Здравствуйте уважаемые форумчане!

Есть вопрос.
Имеем xml-файл с примерно таким содержанием:
Код:

<id="1" x="108" y="34" w="8" h="16" />
<id="8" x="117" y="34" w="8" h="16"/>
<id="55" x="126" y="34" w="8" h="16" />
<id="157" x="175" y="0" w="9" h="16" />

Так вот, как сделать так, чтобы после обработки получился вот это:
Формула расчета:
id = x, y, x+w, y+h


То есть:
Код:

1 = 108, 34, 116, 50
8 = 117, 34, 125, 50
55 =126, 34, 134, 50
157 = 175, 0, 184, 16

...и сохранился в файле.

Заранее спасибо!

Iska 29-09-2018 22:39 2833565

Цитата:

Цитата sector2484
Имеем xml-файл с примерно таким содержанием: »

Упакуйте Ваш xml-файл с точным и полным содержимым в архив и приложите к сообщению.

sector2484 29-09-2018 22:45 2833566

Вложений: 1
Цитата:

Цитата Iska
Упакуйте Ваш xml-файл с точным и полным содержимым в архив и приложите к сообщению. »


Iska 29-09-2018 23:11 2833572

sector2484, это не xml, это какой-то огрызок от него.

Попробуйте так (на WSH):
Скрытый текст
Код:

Option Explicit

Dim strSourceFile
Dim strDestFile

Dim objFSO
Dim objRegExp

Dim arrContent
Dim strLine
Dim strResultLine


strSourceFile = "C:\Мои проекты\0202\cords.xml"
strDestFile  = "C:\Мои проекты\0202\Result.txt"

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

If objFSO.FileExists(strSourceFile) Then
        With objFSO.OpenTextFile(strSourceFile)
                arrContent = Split(.ReadAll(), vbCrLf)
                .Close
        End With
       
        Set objRegExp = WScript.CreateObject("VBScript.RegExp")
       
        With objRegExp
                .Pattern    = "^<id=""(\d+)""\s+x=""(\d+)""\s+y=""(\d+)""\s+w=""(\d+)""\s+h=""(\d+)""\s+/>$"
                .IgnoreCase = True
        End With
       
        With objFSO.CreateTextFile(strDestFile, True)
                For Each strLine In arrContent
                        If objRegExp.Test(strLine) Then
                                With objRegExp.Execute(strLine).Item(0).Submatches
                                        strResultLine = .Item(0) & " = " & .Item(1) & ", " & .Item(2) & ", " & .Item(3) & ", " & .Item(4)
                                End With
                               
                                .WriteLine strResultLine
                        Else
                                WScript.Echo "Can't parse string [" & strLine & "]."
                        End If
                Next
               
                .Close
        End With
       
        Set objRegExp = Nothing
Else
        WScript.Echo "Can't find source file [" & strSourceFile & "]."
        WScript.Quit 2
End If

Set objFSO = Nothing

WScript.Quit 0


sector2484 29-09-2018 23:29 2833574

Цитата:

Цитата Iska
на WSH »

На BAT никак?

Iska 29-09-2018 23:34 2833576

sector2484, а какая разница?

sector2484 30-09-2018 00:04 2833580

Отошли от темы.

YuS_2 30-09-2018 07:47 2833588

sector2484, шашечки или ехать? Или студент, а задание для cmd? :)

Iska 30-09-2018 08:22 2833590

sector2484, если очень хочется, то:
Скрытый текст
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFile=C:\Мои проекты\0202\cords.xml
set sDestFile=C:\Мои проекты\0202\Result2.txt

if exist "%sSourceFile%" (
        >"%sDestFile%" (
                for /f usebackq^ tokens^=2^,4^,6^,8^,10^ delims^=^" %%i in ("%sSourceFile%") do (
                        echo %%~i = %%~j, %%~k, %%~l, %%~m
                )
        )
) else (
        echo Can't find source file [%sSourceFile%].
        exit /b 1
)

endlocal
exit /b 0


sector2484 30-09-2018 10:29 2833604

Цитата:

Цитата Iska
for /f usebackq^ tokens^=2^,4^,6^,8^,10^ delims^=^" %%i in ("%sSourceFile%") do (
echo %%~i = %%~j, %%~k, %%~l, %%~m »

Работает, но по формуле id = x, y, w, h, а не id = x, y, x+w, y+h.

Iska 30-09-2018 12:22 2833632

sector2484, прошу прощения, как-то не обратил особого внимания на формулу.

WSH
Код:

Option Explicit

Dim strSourceFile
Dim strDestFile

Dim objFSO
Dim objRegExp

Dim arrContent
Dim strLine
Dim strResultLine


strSourceFile = "C:\Мои проекты\0202\cords.xml"
strDestFile  = "C:\Мои проекты\0202\Result.txt"

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

If objFSO.FileExists(strSourceFile) Then
        With objFSO.OpenTextFile(strSourceFile)
                arrContent = Split(.ReadAll(), vbCrLf)
                .Close
        End With
       
        Set objRegExp = WScript.CreateObject("VBScript.RegExp")
       
        With objRegExp
                .Pattern    = "^<id=""(\d+)""\s+x=""(\d+)""\s+y=""(\d+)""\s+w=""(\d+)""\s+h=""(\d+)""\s+/>$"
                .IgnoreCase = True
        End With
       
        With objFSO.CreateTextFile(strDestFile, True)
                For Each strLine In arrContent
                        If objRegExp.Test(strLine) Then
                                With objRegExp.Execute(strLine).Item(0).Submatches
                                        strResultLine = _
                                                .Item(0) & " = " & _
                                                .Item(1) & ", " & _
                                                .Item(2) & ", " & _
                                                CStr(CLng(.Item(1)) + CLng(.Item(3))) & ", " & _
                                                CStr(CLng(.Item(2)) + CLng(.Item(4)))
                                End With
                               
                                .WriteLine strResultLine
                        Else
                                WScript.Echo "Can't parse string [" & strLine & "]."
                        End If
                Next
               
                .Close
        End With
       
        Set objRegExp = Nothing
Else
        WScript.Echo "Can't find source file [" & strSourceFile & "]."
        WScript.Quit 2
End If

Set objFSO = Nothing

WScript.Quit 0

Пакетный файл
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFile=C:\Мои проекты\0202\cords.xml
set sDestFile=C:\Мои проекты\0202\Result2.txt

if exist "%sSourceFile%" (
        >"%sDestFile%" (
                for /f usebackq^ tokens^=2^,4^,6^,8^,10^ delims^=^" %%i in ("%sSourceFile%") do (
                        set id=%%~i
                       
                        set /a x = %%~j
                        set /a y = %%~k
                        set /a w = %%~l
                        set /a h = %%~m
                       
                        set /a xw = !x! + !w!
                        set /a yh = !y! + !h!
                       
                        echo !id! = !x!, !y!, !xw!, !yh!
                )
        )
) else (
        echo Can't find source file [%sSourceFile%].
        exit /b 1
)

endlocal
exit /b 0


Busla 30-09-2018 12:25 2833633

Цитата:

Цитата Iska
Упакуйте Ваш xml-файл с точным и полным содержимым »

смысл xml в том, что у него нет "точного" содержимого - порядок и пробельные символы могут меняться
раз уж взялись за WSH - там есть DOM и xpath для вменяемого парсинга xml

Iska 30-09-2018 12:45 2833637

Цитата:

Цитата Iska
Упакуйте Ваш xml-файл с точным и полным содержимым в архив »

Цитата:

Цитата Busla
смысл xml в том, что у него нет "точного" содержимого - порядок и пробельные символы могут меняться »

Busla, «полное» и «точное» содержимое есть у файла, будь он хоть с xml, хоть без. Мне было важно получить именно тот файл, с которым работает автор, в неизменном виде. А не кусочки/выжимки/переделки из него.

Цитата:

Цитата Busla
раз уж взялись за WSH - там есть DOM и xpath для вменяемого парсинга xml »

«Вменяемый парсинг xml» оставляю Вам ;). Вы сам файл видели?

sector2484 30-09-2018 16:49 2833681

Цитата:

Цитата Iska

Ура! Работает! Большое спасибо Вам!

Iska 30-09-2018 18:18 2833693

sector2484, имейте в виду, что возможности вычислений для пакетных файлов крайне ограничены — если там окажутся вещественные значения или целые, но слишком большие значения — мы получим некорректные результаты. В этом случае пробуйте пользовать WSH.

Busla 01-10-2018 09:50 2833752

Цитата:

Цитата Iska
Вы сам файл видели? »

вот только сейчас посмотрел - xml там и не пахнет

All people lie (c)

Iska 01-10-2018 12:42 2833778

Цитата:

Цитата Busla
xml там и не пахнет »

Ото ж :(.


Время: 03:50.

Время: 03:50.
© OSzone.net 2001-