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