Увеличение значения атрибута в файле XML с помощью пакетного сценария

Я пытаюсь отредактировать файл xml и увеличить значение атрибута с именем «pageindex».

Данные в xml файле выглядят так

?xml version="1.0" encoding="UTF-8"?>
<quer:query productCode="RC1700" model="http://www.taleo.com/ws/tee800/2009/01" projectedClass="Candidate" locale="en" alias="MainQuery" mode="T-XML" largegraph="true"
preventDuplicates="false" attributes="pageindex=1,pagingsize=350" 
xmlns:quer="http://www.taleo.com/ws/integration/query">
<quer:subQueries/><quer:projections>
<quer:projection><quer:field path="Number"/>
</quer:projection><quer:projection><quer:field path="FirstName"/> 

Это пакетный скрипт, который я создал, но значение «1» не увеличивается.

    @echo off
    setlocal EnableExtensions DisableDelayedExpansion
    
    rem // Define constants here:
    set "_FILE=pagexml" & rem // (input file; `%~1` is the first argument)
    set "_INI=<quer:query productCode="RC1700" model="http://www.taleo.com/ws/tee800/2009/01" projectedClass="Candidate" locale="en" alias="MainQuery" mode="T-XML" largegraph="true" preventDuplicates="false" attributes=" &
    set "_TAG=pageindex=" & rem // (opening tag)
    
    rem // Loop over all (non-empty) lines of the input file:
    (for /F "usebackq delims=" %%L in ("%_FILE%") do (
        rem // Store current line string:
        set "LINE=%%L"
        rem // Toggle delayed expansion to avoid troubles with `!`:
        setlocal EnableDelayedExpansion
        rem // Split off opening tag from line string:
        set "TEST=!LINE:*%_TAG%=!"
        rem // Check whether opening tag has been found:
        if not "!TEST!"=="!LINE!" (
            rem // Opening tag found, hence split off closing tag:
            for /F "tokens=1* eol=, delims=, " %%S in ("!TEST!") do (
                rem // Get extracted number and increment it:
                set /A "NUM=%%S+1"
            rem // Return rebuild line with incremented number:
                echo( !_INI!!_TAG!!NUM!^,%%T
            )
        ) else (
            rem // Opening tag not found, hence return original line:
            echo(!LINE!
        )
        endlocal
    ))>pageTmp.xml 
    
    
    copy /v /y "pageTmp.xml" "page.xml"

del "pageTmp.xml"

Это вывод, который я получаю, когда запускаю летучую мышь. Вы можете видеть, что атрибут pageindex не возвращает никакого значения.

?xml version="1.0" encoding="UTF-8"?>
<quer:query productCode="RC1700" model="http://www.taleo.com/ws/tee800/2009/01" projectedClass="Candidate" locale="en" alias="MainQuery" mode="T-XML" largegraph="true"
preventDuplicates="false" attributes="pageindex=,pagingsize=350" 
xmlns:quer="http://www.taleo.com/ws/integration/query">
<quer:subQueries/><quer:projections>
<quer:projection><quer:field path="Number"/>
</quer:projection><quer:projection><quer:field path="FirstName"/>

Как это исправить? Также я впервые работаю с пакетным скриптом!


person Coding    schedule 05.03.2021    source источник
comment
Я видел этот код где-то еще… ;-) В любом случае, для редактирования XML-данных вы должны использовать язык, который изначально его поддерживает (например, PowerShell, VBScript, JavaScript, например)…   -  person aschipfl    schedule 05.03.2021
comment
Похоже, что данный текст не считается допустимым файлом XML. Попробуйте с PowerShell, используя [xml](Get-Content -Path 'C:\src\t\quer.xml').   -  person lit    schedule 05.03.2021


Ответы (1)


Первая проблема заключается в вашей строке поиска _TAG=pageindex=.
При использовании ее в set "TEST=!LINE:*%_TAG%=!" это приводит к

==1,pagingsize=350"

Знак равенства удваивается, потому что выражение поиска не может содержать знак равенства, знак равенства всегда используется для разделения части поиска и замены.
Вы ищете pageindex и заменяете его на =

Поэтому %%S содержит ==1, а set /a NUM===1+1 не работает

Вы можете решить эту проблему, изменив delims=, на delims=,= в

for /F "tokens=1* eol=, delims=,= " %%S in ("!TEST!") do (
person jeb    schedule 05.03.2021