1

Тема: любой: замена текста

Имеется:
файлы *.xml в одну строку
рабочий бантник которому необходим многострочный файл

Необходимо:
найти закрытие тега и вставить перенос на новую строку, а именно заменить "><" на ">перенос строки<" (>/n< в Notepad++)


в бат файле имеется переменная %File_name% с именем обрабатываемого файла. В идеале встроить скрипт в батник.

Буду рад любому варианту с комментариями (чтоб разобраться в происходящем)

один из примеров обрабатываемого файла в приложении.

Post's attachments

doc94313.xml 2.53 kb, 14 downloads since 2013-04-22 

You don't have the permssions to download the attachments of this post.

2

Re: любой: замена текста

arey, xml лучше, удобнее и надёжнее разбирать при помощи WSH или PoSH. Что у Вас в «рабочем бантнике»? Возможно, будет удобнее перевести всё на указанные языки.

3

Re: любой: замена текста

alexii пишет:

xml лучше, удобнее и надёжнее разбирать при помощи WSH или PoSH.

Согласен, тот же XQuery значительно облегчил бы задачу, но к сожалению написать что либо могу лишь средствами командной строки.

"рабочий" батник выложу чуть позже

4 (изменено: Rumata, 2013-04-22 14:05:13)

Re: любой: замена текста

С помощью команд пакета Unixutils, Cygwin и им подобных

sed "s/></>\n</g" <doc94313.xml >result.xml

С помощью Perl

perl -pe "s/></>\n</g" <doc94313.xml >result.xml

С помощью JScript+CMD
z.bat <doc94313.xml >result.xml


@set @x=0/*!&&@set @x=
@ %windir%\System32\cscript.exe //nologo //e:javascript "%~dpnx0" %*
@goto :eof */


var stdin = WScript.StdIn;
var stdout = WScript.StdOut;

while ( ! stdin.AtEndOfStream ) {
    var inputLine = stdin.ReadLine();
    var outputLine = inputLine.replace(/></g, '>\n<');
    stdout.WriteLine(outputLine);
}
( 2 * b ) || ! ( 2 * b )

5 (изменено: badik, 2013-04-23 08:05:31)

Re: любой: замена текста

Скрипт для красивого форматирования с отступами длинных XML indent.js:

// Украсить XML-дерево вставкой отступов. (C) Anton Lapounov 2005
function Indent(node, curIndent, levelIndent)
{
    // Если у узла нет содержимого, ничего не делать
    if (!node.hasChildNodes)
    {
        return;
    }
 
    // Если содержимое включает текстовые узлы, ничего не делать
    for (var child = node.firstChild; child != null; child = child.nextSibling)
    {
        if (child.nodeType == 3 ||  // PCDATA
            child.nodeType == 4)    // CDATA
        {
            break;
        }
    }
 
    if (child != null)
    {
        return;
    }
 
    // Вставить текстовые узлы с отступами между дочерними узлами и обработать их рекурсивно
    var newIndent = curIndent + levelIndent;
    var textNode = node.ownerDocument.createNode(3, "", "");
    textNode.text = newIndent;
 
    for (child = node.firstChild; child != null; child = child.nextSibling)
    {
        node.insertBefore(textNode.cloneNode(false), child);
        Indent(child, newIndent, levelIndent);
    }
 
    textNode.text = curIndent;
    node.appendChild(textNode);
}
 
// Пример использования функции Indent:
 
// Загрузить XML-документ из файла XML.xml
var doc = new ActiveXObject("MSXML2.DomDocument");
doc.async = false;
 
if (!doc.load(WScript.Arguments(0)))
{
    WScript.Echo("ERROR: " + doc.parseError.reason);
    WScript.Quit(1);
}
 
// Вставить отступы: перевод строки + 2 пробела на каждый уровень
Indent(doc.documentElement, "\n", "  ");
 
// Показать документ с отступами
//WScript.Echo(doc.xml);
 
// Сохранить документ с отступами в файл XML.xml
doc.save(WScript.Arguments(0));

Запуск
Cscript indent.js  file.xml

6

Re: любой: замена текста

Rumata пишет:

С помощью JScript+CMD
z.bat <doc94313.xml >result.xml

Благодарю, Ваш пример работает.
но мне не удалось встроить это в "рабочий" bat файл.
сейчас это выглядит следующим образом:

rem  Узнать количество строк в файле
for /f %%n in ( 'more ^< "%file_name%" ^| find /c /v ""' ) do set tail_count=%%n
rem  если в файле 1 строка - расставить переносы
if %tail_count%==1 call z.cmd <%file_name% >new_%file_name%
rem прибираем
del %file_name%
ren new_%file_name% %file_name%

может какое более рациональное решение подскажите ?

7

Re: любой: замена текста

badik пишет:

Скрипт для красивого форматирования с отступами длинных XML indent.js:

Спасибо за интересный код с комментариями.

Мне больше подходит вариант, предложенный Rumata
вот только пока не удалось встроить в основной файл, приходится из одного батника вызывать другой

если встроить в файл, то выходит ошибка:

d:\script\CMD\XML\new.bat(1, 7) Ошибка компиляции Microsoft JScript: Предполагае
тся наличие '@'

8 (изменено: Rumata, 2013-04-24 12:24:54)

Re: любой: замена текста

arey, идея очень простая. Вот скелет файла


@set @x=0/*!&&@set @x=

@echo off

Впишите любой код командного интерпретатора. 

Вызов команд JScript выполняйте следующей командой
Укажите параметры, имена входных и выходных файлов в конце этой строки
%windir%\System32\cscript.exe //nologo //e:javascript "%~dpnx0" 

@goto :eof */

Здесь любой JScript код
( 2 * b ) || ! ( 2 * b )

9

Re: любой: замена текста

не идет одним файлом у меня

во вложении весь батник
обращение к вашему коду идет в 107 строке
ваш код на 286 строке начинается

из-за особенности форума (ограничение по ссылкам) код не могу привести прямо тут. все во вложении

Post's attachments

XML.zip 14.34 kb, 8 downloads since 2013-04-24 

You don't have the permssions to download the attachments of this post.

10

Re: любой: замена текста

arey пишет:

во вложении весь батник

Нет там его

( 2 * b ) || ! ( 2 * b )

11 (изменено: arey, 2013-04-25 06:44:10)

Re: любой: замена текста

извиняюсь, не то прикрепил

немного изменен файл. сейчас:
в 96 строке

call :zamena <"%file_name%" >"new_%file_name%"

в 274

:zamena
@set @x=0/*!&&@set @x=
...