Войти

Показать полную графическую версию : Получение значении из XML и сохранение в txt


sector2484
29-09-2018, 22:24
Здравствуйте уважаемые форумчане!

Есть вопрос.
Имеем 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
Имеем xml-файл с примерно таким содержанием: »
Упакуйте Ваш xml-файл с точным и полным содержимым в архив и приложите к сообщению.

sector2484
29-09-2018, 22:45
Упакуйте Ваш xml-файл с точным и полным содержимым в архив и приложите к сообщению. »

Iska
29-09-2018, 23:11
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
на WSH »
На BAT никак?

Iska
29-09-2018, 23:34
sector2484, а какая разница?

sector2484
30-09-2018, 00:04
Отошли от темы.

YuS_2
30-09-2018, 07:47
sector2484, шашечки или ехать? Или студент, а задание для cmd? :)

Iska
30-09-2018, 08:22
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
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
sector2484, прошу прощения, как-то не обратил особого внимания на формулу.

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
Упакуйте Ваш xml-файл с точным и полным содержимым »
смысл xml в том, что у него нет "точного" содержимого - порядок и пробельные символы могут меняться
раз уж взялись за WSH - там есть DOM и xpath для вменяемого парсинга xml

Iska
30-09-2018, 12:45
Упакуйте Ваш xml-файл с точным и полным содержимым в архив »
смысл xml в том, что у него нет "точного" содержимого - порядок и пробельные символы могут меняться »
Busla, «полное» и «точное» содержимое есть у файла, будь он хоть с xml, хоть без. Мне было важно получить именно тот файл, с которым работает автор, в неизменном виде. А не кусочки/выжимки/переделки из него.

раз уж взялись за WSH - там есть DOM и xpath для вменяемого парсинга xml »
«Вменяемый парсинг xml» оставляю Вам ;). Вы сам файл видели?

sector2484
30-09-2018, 16:49
»

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

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

Busla
01-10-2018, 09:50
Вы сам файл видели? »
вот только сейчас посмотрел - xml там и не пахнет

All people lie (c)

Iska
01-10-2018, 12:42
xml там и не пахнет »
Ото ж :(.




© OSzone.net 2001-2012