如何循环批处理cmd中的xml值

som*_*ool 0 xml cmd batch-file batch-processing

如果我有以下xml:

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

<c> 
    <b>valA</b>
    <b>valB</b>
</c> 
Run Code Online (Sandbox Code Playgroud)

和以下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
Run Code Online (Sandbox Code Playgroud)

)

我需要访问节点b的值,但只有我有这样的值时,上述代码才有效

<a>asdf</a>
Run Code Online (Sandbox Code Playgroud)

我只想迭代父元素a

Aac*_*ini 5

劳驾.我想我真的不明白你需要什么,但下面的Batch文件显示了server.xml文件中节点b的值:

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

结果:

valA
valB
Run Code Online (Sandbox Code Playgroud)

这是你想要的吗?

编辑: 根据附加评论添加新版本

@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
Run Code Online (Sandbox Code Playgroud)

鉴于此数据文件:

<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>
Run Code Online (Sandbox Code Playgroud)

上一批文件得到以下结果:

valB1-A
valB2-A
valB3-A
valB4-A
Run Code Online (Sandbox Code Playgroud)

我假设了几个细节.