Показать полную графическую версию : [решено] замена значения в xml-файле
firstarey
17-09-2012, 13:29
имеется файл xml следующего содержания:
<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="https://portal.rosreestr.ru/xsl/GKN/Vidimus/04/common.xsl"?><Region_Cadastr_Vidimus_KV><eDocument CodeType="114" Version="04">
все в одну строку
необходим bat файл который будет заменять текст помеченный голубым на: \\serv\папки\xml\common.xsl
вторая задача:
запустить IE в автономном режиме на просмотр этого файла
пока bat умеет лишь брать имя xml который лежит в той же папке в переменную:
@title [replace]
@echo off
Color 0e
Set find="https://portal.rosreestr.ru/xsl/GKN/Vidimus/04/common.xsl"
Set replace="\\serv\папки\xml\common.xsl"
rem берем имя от файла с разрешением xml:
for %%i in (*.xml) do set FILENAME=%FILENAME% %%i
rem убираем пробел перед именем
set FILEnamefull=%FILENAME:~1%
rem убираем разрешение (4 символа с конца)
set FILEname=%FILEnamefull:~0,-4%
rem выводим результат на экран
echo %FILEnamefull%
echo %FILEname%
в результате должен получится файл %FILEname%_local.xml и открыться в IE
@echo off
setlocal enabledelayedexpansion
Set _find="https://portal.rosreestr.ru/xsl/GKN/Vidimus/04/common.xsl"
Set _replace="\\serv\папки\xml\common.xsl"
for %%J in (*.xml) do (
set s=%%~nJ
if "!s:~-6!" neq "_local" (
for /f "delims=" %%I in (%%~sJ) do (
set s=%%I
echo !s:%_find%=%_replace%!>"%%~nJ_local.xml"
)
start iexplore.exe "%%~dpJ%%~nJ_local.xml"
)
)
firstarey
18-09-2012, 06:44
благодарю за помощь, но отрабатывает не совсем корректно:
требуется заменить только указанное значение, а в результате отработки скрипта получается 2 разных файла (во втором отсутствует заменяемое значение)
прикладываю файл-пример, чтобы Вы могли проверить
firstarey
18-09-2012, 06:48
http://rghost.ru/40431526
firstarey
18-09-2012, 09:54
попробовал так же через CHGSTR.EXE, но он убивает кодировку и в итоговом файле вместо русских букв кракозябры
есть ли какой то способ обработать xml файл заменив >< на >\n< (т.е. перенос строк после закрытия тега) ?
тогда было бы проще - можно заменить вторую строку целиком
firstarey, пробуйте WSH:
Option Explicit
Dim strFile
Dim objNode
If WScript.Arguments.Count = 1 Then
strFile = WScript.Arguments.Item(0)
If WScript.CreateObject("Scripting.FileSystemObject").FileExists(strFile) Then
With WScript.CreateObject("MSXML2.DOMDocument")
.async = False
.load strFile
If .parseError.errorCode = 0 Then
For Each objNode In .childNodes
If objNode.nodeType = 7 Then
If objNode.baseName = "xml-stylesheet" Then
If objNode.data = "type=""text/xsl"" href=""https://portal.rosreestr.ru/xsl/GKN/Vidimus/04/common.xsl""" Then
WScript.Echo "Node found"
objNode.data = "type=""text/xsl"" href=""\\serv\папки\xml\common.xsl"""
Exit For
End If
End If
End If
Next
Else
WScript.Echo "Error [" & .parseError.errorCode & "] in xml [" & strFile & "]"
End If
.save strFile
End With
Else
WScript.Echo "File [" & strFile & "] not found"
End If
Else
WScript.Echo "Usage: " & WScript.ScriptName & " <xml-file>"
End If
WScript.Quit 0
Update: Забыл про:
вторая задача:
запустить IE в автономном режиме на просмотр этого файла »
Option Explicit
Const READYSTATE_COMPLETE = 4
Dim strFile
Dim objNode
Dim objIE
If WScript.Arguments.Count = 1 Then
strFile = WScript.Arguments.Item(0)
If WScript.CreateObject("Scripting.FileSystemObject").FileExists(strFile) Then
With WScript.CreateObject("MSXML2.DOMDocument")
.async = False
.load strFile
If .parseError.errorCode = 0 Then
For Each objNode In .childNodes
If objNode.nodeType = 7 Then
If objNode.baseName = "xml-stylesheet" Then
If objNode.data = "type=""text/xsl"" href=""https://portal.rosreestr.ru/xsl/GKN/Vidimus/04/common.xsl""" Then
WScript.Echo "Node found"
objNode.data = "type=""text/xsl"" href=""\\serv\папки\xml\common.xsl"""
.save strFile
Exit For
End If
End If
End If
Next
Else
WScript.Echo "Error [" & .parseError.errorCode & "] in xml [" & strFile & "]"
End If
End With
With WScript.CreateObject("InternetExplorer.Application")
.Navigate("file:///" & strFile)
Do
WScript.Sleep 100
Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
.Visible = True
End With
Else
WScript.Echo "File [" & strFile & "] not found"
End If
Else
WScript.Echo "Usage: " & WScript.ScriptName & " <xml-file>"
End If
WScript.Quit 0
firstarey
18-09-2012, 11:56
Iska, простите, а как запустить *.wsh файл ?
дважды нажимаю выходит окно "сценарий не указан"
совсем не знаком с wsh :blush:
firstarey, сохраните код в файле с расширением «.vbs» (VBScript — один из языков, поддерживаемых WSH «искаропки»). Перетащите на него Ваш xml (сначала опробуйте на копии).
firstarey
18-09-2012, 12:03
средствами CHGSTR.EXE довольно легко решается задача, но проблема в том, что он все русские символы переводит в CP1251 из UTF-8
может есть какой простой способ вернуть кодировку на место ?
Iska, Ваш скрипт работает, большое спасибо :up:
th1zar@vk
12-02-2013, 10:45
Для полноценного локального отображения данных выписок, необходимо немного подредактировать сам шаблон преобразования, т.к. в нем имеется ссылка на Портал Росреестра. Необходимо убрать эту ссылку. Либо же, как вариант, воспользоваться специальной версией преобразований для локального просмотра.
Товарищи, добрый день. Помоги пожалуйста написать батник. Имеется xml файл следующего содержания:
<?xml version="1.0" encoding="UTF-8"?>
<PacketEPD xmlns="urn:cbr-ru:ed:v2.0" EDQuantity="1" Sum="175000" SystemCode="01" EDNo="1" EDDate="2017-11-03" EDAuthor="9999999999">
<ED101 TransKind="01" Priority="5" SystemCode="01" EDReceiver="0000000000" Sum="175000" EDNo="000000000" EDDate="2017-11-02" EDAuthor="0702615000">
<AccDoc AccDocNo="000000" AccDocDate="2017-11-02"></AccDoc>
<Payer PersonalAcc="00000000000000000000" INN="0000000000" KPP="000000000">
<Name>тест</Name>
<Bank BIC="000000000" CorrespAcc="00000000000000000000"></Bank>
</Payer>
<Payee PersonalAcc="00000000000000000000" INN="000000000" KPP="000000000">
<Name>тест "тест"</Name>
<Bank BIC="000000000" CorrespAcc="00000000000000000000"></Bank>
</Payee>
<Purpose>тест</Purpose>
</ED101>
</PacketEPD>
В нем батником нужно значение CorrespAcc= заменить на другой счет и дата в поле EDDate должно равняться дате в поле AccDocDate.
заменить на другой счет »
Откуда брать значение этого «другого счёта»?
Не большое уточнение в xml файле значение CorrespAcc="30101810600000000758" мне нужно заменить этот счет на 30109810060340000009. Мне кажется это значение нужно прописать в батнике.
значение CorrespAcc="30101810600000000758" »
Заменить, только если «CorrespAcc» будет равен «30101810600000000758»? Или неважно, что там будет, меняем в любом случае?
Kadoh, а в каких разделах менять — в «Payer», в «Payee» или в любом/обоих?
Kadoh, на WSH:
Option Explicit
Dim strFile
Dim strCurrCorrespAccValue
Dim strNewCorrespAccValue
Dim objXMLDOMElement
strCurrCorrespAccValue = "30101810600000000758"
strNewCorrespAccValue = "30109810060340000009"
If WScript.Arguments.Count = 1 Then
strFile = WScript.Arguments.Item(0)
If WScript.CreateObject("Scripting.FileSystemObject").FileExists(strFile) Then
With WScript.CreateObject("MSXML2.DOMDocument")
.async = False
If .load(strFile) Then
For Each objXMLDOMElement In .selectNodes("/PacketEPD/ED101/Payee/Bank[@CorrespAcc=""" & strCurrCorrespAccValue & """]")
objXMLDOMElement.setAttribute "CorrespAcc", strNewCorrespAccValue
Next
.save strFile
Else
WScript.Echo "Can't load xml content from [" & strFile & "]."
End If
End With
Else
WScript.Echo "File [" & strFile & "] not found"
End If
Else
WScript.Echo "Usage: " & WScript.ScriptName & " <xml-file>"
End If
WScript.Quit 0
Путь к файлу xml задаётся параметром скрипта (также можно просто перетянуть xml-файл на скрипт в Проводнике).
Iska, пр запуске выдает ошибку:
Строка: 1
Символ: 8
Ошибка: Предполагается наличие ";"
Код: 800А03ЕС
Iska подскажи в каком месте указать путь к файлу?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.