Board logo

标题: [文件操作] 【已解决】批处理查找并替换指定xml节点值 [打印本页]

作者: liwqiang    时间: 2014-9-19 22:31     标题: 【已解决】批处理查找并替换指定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">

哪位高手帮忙整下!
作者: CrLf    时间: 2014-9-20 00:57

撸主方便发个样本用于测试吗?
作者: liwqiang    时间: 2014-9-20 09:02

现在加班,办公网络不能上传东西,晚上回去会发一份样本出来
作者: terse    时间: 2014-9-20 18:30

仅参考一楼
  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
复制代码

作者: DAIC    时间: 2014-9-20 18:55

用记事本打开你的xml
文件
另存为
看看是不是ANSI格式的,如果是,可以试试楼上的代码。
作者: liwqiang    时间: 2014-9-20 23:19

回复 4# terse

执行代码后,其他地方也被替换了
作者: liwqiang    时间: 2014-9-20 23:20

回复 5# DAIC


    是ANSI格式的
作者: terse    时间: 2014-9-21 00:15

回复 6# liwqiang
看情况是没分行的 所以代码无效
作者: apang    时间: 2014-9-21 00:19

这样试试:
  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)
复制代码

作者: tmplinshi    时间: 2014-9-21 04:10

@apang
不错的 JS BAT 混编模板,我收藏了
作者: liwqiang    时间: 2014-9-21 14:28

回复 9# apang


    使用这个代码,成功解决问题了,非常感谢您的帮助
作者: liwqiang    时间: 2014-9-21 14:30

问题已经解决,非常感谢各位的帮助,特别是terse和apang两位,谢谢!!!
作者: apang    时间: 2014-9-22 13:19

回复 10# tmplinshi


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

这么正规的 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")
复制代码

作者: CrLf    时间: 2014-9-22 22:38

回复 13# apang


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

回复 9# apang


    大神:我的XML是UTF-8格式的,用这个脚本后里面有些中文变成乱码了,请问下能否帮忙整个UTF-8适用的脚本???
作者: apang    时间: 2014-10-21 20:08

回复 16# dea2140


    14楼CrLf大神的powershell脚本可以满足你的要求,你可能没测试。

接受CrLf的建议,用xml DOM,纯属练习
  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. )
  6. pause & exit/b & rem */
  7. arg = WScript.Arguments;
  8. xmlDom = new ActiveXObject("MSXML2.DOMDocument");
  9. xmlDom.load(arg(0));
  10. ar = xmlDom.getElementsByTagName("con:config");
  11. for (i=0; i<ar.length; i++) {
  12.         s = ar[i].getAttribute("resourcePath");
  13.         if (s == arg(1)) ar[i].setAttribute("methodName", arg(2));
  14. }
  15. xmlDom.save(arg(0));
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2