[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 【已解决】批处理查找并替换指定xml节点值

xml文件中有下面格式的字符串
<con:config service="WebService" resourcePath="/management/node/query" methodName="getNodesByQuery">

另外有个txt文件,里面的内容格式如下(不只一行)
/management/node/query GET

现在需要做的是,从txt文件中读取一行数据后,用读取的第一个值/management/node/query去匹配xml中resourcePath的值,如果匹配成功,那就将methodName节点的值替换为获取的第二个值GET

替换成功后,xml中的字符串应该是下面这样
<con:config service="WebService" resourcePath="/management/node/query" methodName="GET">

哪位高手帮忙整下!
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

撸主方便发个样本用于测试吗?

TOP

现在加班,办公网络不能上传东西,晚上回去会发一份样本出来

TOP

仅参考一楼
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "tokens=1*" %%i in (2.txt) do set $"%%i"="%%j"
  3. (for /f "tokens=1*delims=:" %%i in ('findstr /in .* 1.xml') do (
  4.      set "str=%%j"
  5.      set "var=!str:*resourcePath=!"
  6.      if "!str!" neq "!var!" if "!var:~,1!" == "=" (
  7.         set "var=!var:*"="!"
  8.         for /f %%a in ("!var!") do (
  9.             if defined $%%a (
  10.                for %%b in ("!str:*%%a=!") do (
  11.                    for /f "tokens=2delims==>" %%c in ("%%~b") do (
  12.                        for %%d in (!$%%a!) do set str=!str:%%c=%%d!
  13.                    )
  14.                )
  15.             )
  16.         )
  17.      )
  18.      echo,!str!
  19. ))>new_fine.xml
  20. pause
复制代码

TOP

用记事本打开你的xml
文件
另存为
看看是不是ANSI格式的,如果是,可以试试楼上的代码。

TOP

回复 4# terse

执行代码后,其他地方也被替换了

TOP

回复 5# DAIC


    是ANSI格式的

TOP

回复 6# liwqiang
看情况是没分行的 所以代码无效

TOP

这样试试:
  1. @set @n=0;/* & echo off
  2. set "xml=example-soapui-project.xml"
  3. for /f "tokens=1*" %%a in (2.txt) do (
  4.     cscript -nologo -e:jscript "%~0"<"%xml%" %%a %%b>$
  5.     move $ "%xml%"
  6. )
  7. pause & exit/b & rem */
  8. arg1 = WScript.Arguments(0);
  9. arg2 = WScript.Arguments(1);
  10. txt = WScript.StdIn.ReadAll();
  11. re = new RegExp('(resourcePath="' + arg1 + '" +methodName=")(.+?)"', 'ig');
  12. txt = txt.replace(re, '$1' + arg2 + '"');
  13. WScript.StdOut.Write(txt)
复制代码
1

评分人数

TOP

@apang
不错的 JS BAT 混编模板,我收藏了

TOP

回复 9# apang


    使用这个代码,成功解决问题了,非常感谢您的帮助

TOP

问题已经解决,非常感谢各位的帮助,特别是terse和apang两位,谢谢!!!

TOP

回复 10# tmplinshi


    我最早看到的bat与js混编代码是powerbat这位大神的,印象非常深刻http://bbs.bathome.net/viewthread.php?tid=27060#pid139641
后来我从terse和CrLf两位大神那里偷学过来一点皮毛,他们才是行家。

TOP

这么正规的 xml 格式,其实可以用 xml dom 来操作,比较严谨且方便
vbs、js 可以用 MSXML2.DOMDocument,powershell 可用 xml.xmldocument...好吧,其实我发这个主要是为了耍花枪:
  1. $xml = [xml](type "example-soapui-project.xml")
  2. $txt = type 2.txt
  3. $txt = $txt -replace '(\S+)\s+(\S+)','if($$_.resourcePath -eq "$1"){$$_.methodName="$2"}'
  4. $xml.GetElementsByTagName("con:config")|%{
  5. $ExecutionContext.InvokeCommand.Invokescript($txt)
  6. }
  7. $xml.save("example-soapui-project.xml")
复制代码

TOP

回复 13# apang


    汗一个,虽不是门外汉,但也不敢高攀“行家”二字...
    我也是看 powerbat 的帖子才知道有这么有趣的用法,但看 batcher 大人在 js 版发的置顶帖youxi01发的介绍帖,好像来自联盟,不懂是哪位高人发明的(难道是 est ?),也许 qzw、hat、terse、plp 那几位古董兄会知道吧
    联盟那个年代,真是有趣

TOP

返回列表