Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] замена значения в xml-файле (http://forum.oszone.net/showthread.php?t=242838)

firstarey 17-09-2012 13:29 1990240

замена значения в xml-файле
 
имеется файл 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

Bob256 17-09-2012 18:45 1990405

Код:

@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 1990649

благодарю за помощь, но отрабатывает не совсем корректно:
требуется заменить только указанное значение, а в результате отработки скрипта получается 2 разных файла (во втором отсутствует заменяемое значение)
прикладываю файл-пример, чтобы Вы могли проверить

firstarey 18-09-2012 06:48 1990651


firstarey 18-09-2012 09:54 1990697

попробовал так же через CHGSTR.EXE, но он убивает кодировку и в итоговом файле вместо русских букв кракозябры

есть ли какой то способ обработать xml файл заменив >< на >\n< (т.е. перенос строк после закрытия тега) ?
тогда было бы проще - можно заменить вторую строку целиком

Iska 18-09-2012 10:55 1990728

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: Забыл про:
Цитата:

Цитата firstarey
вторая задача:
запустить 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 1990771

Iska, простите, а как запустить *.wsh файл ?
дважды нажимаю выходит окно "сценарий не указан"
совсем не знаком с wsh :blush:

Iska 18-09-2012 12:00 1990773

firstarey, сохраните код в файле с расширением «.vbs» (VBScript — один из языков, поддерживаемых WSH «искаропки»). Перетащите на него Ваш xml (сначала опробуйте на копии).

firstarey 18-09-2012 12:03 1990775

средствами CHGSTR.EXE довольно легко решается задача, но проблема в том, что он все русские символы переводит в CP1251 из UTF-8
может есть какой простой способ вернуть кодировку на место ?

Iska, Ваш скрипт работает, большое спасибо :up:

th1zar@vk 12-02-2013 10:45 2088515

Для полноценного локального отображения данных выписок, необходимо немного подредактировать сам шаблон преобразования, т.к. в нем имеется ссылка на Портал Росреестра. Необходимо убрать эту ссылку. Либо же, как вариант, воспользоваться специальной версией преобразований для локального просмотра.

Kadoh 10-11-2017 11:35 2776601

Товарищи, добрый день. Помоги пожалуйста написать батник. Имеется 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.

Iska 10-11-2017 12:25 2776615

Цитата:

Цитата Kadoh
заменить на другой счет »

Откуда брать значение этого «другого счёта»?

Kadoh 10-11-2017 12:35 2776619

Не большое уточнение в xml файле значение CorrespAcc="30101810600000000758" мне нужно заменить этот счет на 30109810060340000009. Мне кажется это значение нужно прописать в батнике.

Iska 10-11-2017 13:54 2776640

Цитата:

Цитата Kadoh
значение CorrespAcc="30101810600000000758" »

Заменить, только если «CorrespAcc» будет равен «30101810600000000758»? Или неважно, что там будет, меняем в любом случае?

Kadoh 10-11-2017 13:55 2776642

только если равен

Iska 10-11-2017 17:35 2776684

Kadoh, а в каких разделах менять — в «Payer», в «Payee» или в любом/обоих?

Kadoh 10-11-2017 17:58 2776688

Payee

Iska 10-11-2017 19:25 2776703

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-файл на скрипт в Проводнике).

Kadoh 13-11-2017 10:56 2777188

Iska, пр запуске выдает ошибку:
Строка: 1
Символ: 8
Ошибка: Предполагается наличие ";"
Код: 800А03ЕС

Kadoh 13-11-2017 11:23 2777195

Iska подскажи в каком месте указать путь к файлу?

Iska 13-11-2017 11:24 2777196

Цитата:

Цитата Kadoh
скриншот во вложении. »

Kadoh, нет вложения.

Цитата:

Цитата Kadoh
Iska, подскажи в каком месте указать путь к файлу? »

Ответ в 18-м сообщении. Я его даже продублирую для верности:
Цитата:

Цитата Iska
Путь к файлу xml задаётся параметром скрипта (также можно просто перетянуть xml-файл на скрипт в Проводнике). »



Время: 12:00.

Время: 12:00.
© OSzone.net 2001-