Как перебрать значения XML в пакетном cmd - PullRequest
0 голосов
/ 28 марта 2012

если у меня есть следующий xml:

<a> 
    <b>valA</b>
    <b>valB</b>
</a> 

<c> 
    <b>valA</b>
    <b>valB</b>
</c> 

и следующий cmd:

for /f "delims=" %%f in ('dir /b /s server.xml') do (
FOR /F "tokens=2 delims=>" %%i in ('findstr "<a>" %%f') do @echo %%i > temp1.txt
FOR /F "tokens=1 delims=<" %%i in (temp1.txt) do @echo %%i

)

мне нужно получить доступ к значениям узла b, но приведенный выше код будет работать, только если у меня есть такие значения

<a>asdf</a>

Я хочу перебирать только родительский элемент a

Ответы [ 2 ]

5 голосов
/ 29 марта 2012

Простите.Я думаю, что я действительно не понимаю, что вам нужно, но пакетный файл ниже показывает значения узла b в файле server.xml:

for /F "tokens=3 delims=<>" %%i in ('findstr "<b>" server.xml') do echo %%i

Результат:

valA
valB

Isэто то, что вы хотите?

РЕДАКТИРОВАТЬ: Новая версия добавлена ​​в соответствии с дополнительным комментарием

@echo off
setlocal EnableDelayedExpansion
set fileName=server.xml
findstr /N "<b>" %fileName% > nodesB.tmp
call :seekNodesA < nodesB.tmp
del nodesB.tmp
goto :EOF

:seekNodesA
set lineB=0
set startLine=
for /F "delims=:" %%a in ('findstr /N "a>" %fileName%') do (
   if not defined startLine (
      set startLine=%%a
   ) else (
      call :checkNodeB !startLine! %%a
      set startLine=
   )
)
exit /B

:checkNodeB startNodeA endNodeA
if %lineB% gtr %1 goto showNodeB
   set nodeB=99999999:
   set /P nodeB=
   for /F "tokens=1* delims=:" %%b in ("%nodeB%") do (
      set lineB=%%b
      set "nodeB=%%c"
   )
goto checkNodeB
:showNodeB
if %lineB% gtr %2 exit /B
   for /F "tokens=3 delims=<>" %%i in ("%nodeB%") do echo %%i
   set nodeB=99999999:
   set /P nodeB=
   for /F "tokens=1* delims=:" %%b in ("%nodeB%") do (
      set lineB=%%b
      set nodeB=%%c
   )
goto showNodeB

Учитывая этот файл данных:

<a>
     <b>valB1-A</b>
     <b>valB2-A</b>
</a>

<c>
     <b>valB1-C</b>
     <b>valB2-C</b>
</c>

<a>
     <b>valB3-A</b>
     <b>valB4-A</b>
</a>

Предыдущий пакетный файл получил такой результат:

valB1-A
valB2-A
valB3-A
valB4-A

Я предположил несколько деталей.

1 голос
/ 07 февраля 2017

Хотя вам нужно добавить корневой элемент, чтобы сделать XML действительным, вы можете проверить xpath.bat :

call xpath.bat "server.xml" "//b"
...