从xml中读取特定单词

时间:2014-07-31 15:00:45

标签: batch-file

我有以下批处理脚本来读取xml文件并找到一个单词(在这种情况下,“ factory ”):< / p>

@echo off & setlocal enabledelayedexpansion
for /f "delims=" %%a in ('findstr /C:"factory" xcsconfig.xml') do set content=%%a
set content=%content:*"=%
set content=%content:~0,-1%
echo %content%
exit /b

以下是 xml 文件的一部分:

   <loggers>
      <recorder1>
         <add name="factory" value="xlog"/>
         <add name="alias" value="WSEnterprise.log"/>
      </recorder1>
      <recorder2>
         <add name="factory" value="weblog"/>
      </recorder2>
   </loggers>

代码工作正常,将始终返回“第一个”创始人 - value =“weblog”/ 。我的问题是,有没有办法在特定标签下返回创始人? (即我想在 recorder1 而不是 record2 标签下进行搜索,并返回答案 value =“xlog”/ )。提前谢谢。

编辑:我改变了我的预期答案,这是不正确的

3 个答案:

答案 0 :(得分:4)

@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sectionstart=recorder1"
SET "insection="
for /f "delims=" %%a in ('type q25062317.txt') do (
 IF DEFINED insection (
  ECHO "%%a"|FINDSTR /c:"factory" >NUL
  IF NOT errorlevel 1 SET "content=%%a"
 )
 ECHO "%%a"|FINDSTR /i /L /c:"<%sectionstart%>" > NUL
 IF NOT ERRORLEVEL 1 SET insection=Y
 ECHO "%%a"|FINDSTR /i /L /c:"</%sectionstart%>" > NUL
 IF NOT ERRORLEVEL 1 SET "insection="
)
set content=!content:*"=!
set content=!content:*"=!
set content=!content:~1,-1!
echo %content%
GOTO :EOF

我使用了一个名为q25062317.txt的文件,其中包含我的测试数据。

答案 1 :(得分:1)

您还可以在do周期的for块中合并下一个语句。我的意思是:

  

setlocal EnableDelayedExpansion
for / f“delims =”%% a in('findstr / C:“factory”xcsconfig.xml')do(
  设置内容= %% a
  set content =!content:*“=!
  set content =!content:~0,-1!
  echo!content!
  )

通过这种方式,输出不仅是最后一个XML代码行,而且还包含所考虑文件中包含“factory”字符串的所有代码行。当然,这个例子不会只回显一个所需的字符串,但这可能会为循环的输出设置一个条件。

答案 2 :(得分:0)

这是一个可以帮助您的强大工具 - 命令看起来像这样可以获得您需要的行,它可以包含在for /f循环中。

type file.xml |findrepl "<recorder1>" /e:"</recorder1>" /b:"factory"

这使用名为findrepl.bat的助手批处理文件(由aacini提供) - 从以下网址下载:https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat

findrepl.bat放在与批处理文件相同的文件夹中或路径上。