找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 92994|回复: 16

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

[复制链接]
发表于 2014-9-19 22:31:24 | 显示全部楼层 |阅读模式
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">

哪位高手帮忙整下!

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2014-9-20 00:57:30 | 显示全部楼层
撸主方便发个样本用于测试吗?
 楼主| 发表于 2014-9-20 09:02:02 | 显示全部楼层
现在加班,办公网络不能上传东西,晚上回去会发一份样本出来
发表于 2014-9-20 18:30:57 | 显示全部楼层
仅参考一楼
  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
复制代码
发表于 2014-9-20 18:55:03 | 显示全部楼层
用记事本打开你的xml
文件
另存为
看看是不是ANSI格式的,如果是,可以试试楼上的代码。
 楼主| 发表于 2014-9-20 23:19:01 | 显示全部楼层
回复 4# terse

执行代码后,其他地方也被替换了
 楼主| 发表于 2014-9-20 23:20:48 | 显示全部楼层
回复 5# DAIC


    是ANSI格式的
发表于 2014-9-21 00:15:02 | 显示全部楼层
回复 6# liwqiang
看情况是没分行的 所以代码无效
发表于 2014-9-21 00:19:31 | 显示全部楼层
这样试试:
  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技术 +1 收起 理由
Batcher + 1 乐于助人

查看全部评分

发表于 2014-9-21 04:10:54 | 显示全部楼层
@apang
不错的 JS BAT 混编模板,我收藏了
 楼主| 发表于 2014-9-21 14:28:34 | 显示全部楼层
回复 9# apang


    使用这个代码,成功解决问题了,非常感谢您的帮助
 楼主| 发表于 2014-9-21 14:30:33 | 显示全部楼层
问题已经解决,非常感谢各位的帮助,特别是terse和apang两位,谢谢!!!
发表于 2014-9-22 13:19:20 | 显示全部楼层
回复 10# tmplinshi


    我最早看到的bat与js混编代码是powerbat这位大神的,印象非常深刻http://bbs.bathome.net/viewthread.php?tid=27060#pid139641
后来我从terse和CrLf两位大神那里偷学过来一点皮毛,他们才是行家。
发表于 2014-9-22 22:25:56 | 显示全部楼层
这么正规的 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")
复制代码
发表于 2014-9-22 22:38:08 | 显示全部楼层
回复 13# apang


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

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 18:17 , Processed in 0.024808 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表