Показать полную графическую версию : Получение значении из 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
...и сохранился в файле.
Заранее спасибо!
Имеем xml-файл с примерно таким содержанием: »
Упакуйте Ваш xml-файл с точным и полным содержимым в архив и приложите к сообщению.
sector2484
29-09-2018, 22:45
Упакуйте Ваш xml-файл с точным и полным содержимым в архив и приложите к сообщению. »
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 никак?
sector2484, а какая разница?
sector2484
30-09-2018, 00:04
Отошли от темы.
sector2484, шашечки или ехать? Или студент, а задание для cmd? :)
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.
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
Упакуйте Ваш xml-файл с точным и полным содержимым »
смысл xml в том, что у него нет "точного" содержимого - порядок и пробельные символы могут меняться
раз уж взялись за WSH - там есть DOM и xpath для вменяемого парсинга xml
Упакуйте Ваш xml-файл с точным и полным содержимым в архив »
смысл xml в том, что у него нет "точного" содержимого - порядок и пробельные символы могут меняться »
Busla, «полное» и «точное» содержимое есть у файла, будь он хоть с xml, хоть без. Мне было важно получить именно тот файл, с которым работает автор, в неизменном виде. А не кусочки/выжимки/переделки из него.
раз уж взялись за WSH - там есть DOM и xpath для вменяемого парсинга xml »
«Вменяемый парсинг xml» оставляю Вам ;). Вы сам файл видели?
sector2484
30-09-2018, 16:49
»
Ура! Работает! Большое спасибо Вам!
sector2484, имейте в виду, что возможности вычислений для пакетных файлов крайне ограничены — если там окажутся вещественные значения или целые, но слишком большие значения — мы получим некорректные результаты. В этом случае пробуйте пользовать WSH.
Вы сам файл видели? »
вот только сейчас посмотрел - xml там и не пахнет
All people lie (c)
xml там и не пахнет »
Ото ж :(.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.