标题: [文件操作] 【已解决】批处理查找并替换指定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
仅参考一楼- @echo off & setlocal enabledelayedexpansion
- for /f "tokens=1*" %%i in (2.txt) do set $"%%i"="%%j"
- (for /f "tokens=1*delims=:" %%i in ('findstr /in .* 1.xml') do (
- set "str=%%j"
- set "var=!str:*resourcePath=!"
- if "!str!" neq "!var!" if "!var:~,1!" == "=" (
- set "var=!var:*"="!"
- for /f %%a in ("!var!") do (
- if defined $%%a (
- for %%b in ("!str:*%%a=!") do (
- for /f "tokens=2delims==>" %%c in ("%%~b") do (
- for %%d in (!$%%a!) do set str=!str:%%c=%%d!
- )
- )
- )
- )
- )
- echo,!str!
- ))>new_fine.xml
- 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
这样试试:- @set @n=0;/* & echo off
- set "xml=example-soapui-project.xml"
- for /f "tokens=1*" %%a in (2.txt) do (
- cscript -nologo -e:jscript "%~0"<"%xml%" %%a %%b>$
- move $ "%xml%"
- )
- pause & exit/b & rem */
-
- arg1 = WScript.Arguments(0);
- arg2 = WScript.Arguments(1);
- txt = WScript.StdIn.ReadAll();
- re = new RegExp('(resourcePath="' + arg1 + '" +methodName=")(.+?)"', 'ig');
- txt = txt.replace(re, '$1' + arg2 + '"');
- 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...好吧,其实我发这个主要是为了耍花枪:- $xml = [xml](type "example-soapui-project.xml")
- $txt = type 2.txt
- $txt = $txt -replace '(\S+)\s+(\S+)','if($$_.resourcePath -eq "$1"){$$_.methodName="$2"}'
-
- $xml.GetElementsByTagName("con:config")|%{
- $ExecutionContext.InvokeCommand.Invokescript($txt)
- }
-
- $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,纯属练习- @set @n=0;/* & echo off
- set "xml=example-soapui-project.xml"
- for /f "tokens=1*" %%a in (2.txt) do (
- cscript -nologo -e:jscript "%~0" "%xml%" "%%a" "%%b"
- )
- pause & exit/b & rem */
-
- arg = WScript.Arguments;
- xmlDom = new ActiveXObject("MSXML2.DOMDocument");
- xmlDom.load(arg(0));
- ar = xmlDom.getElementsByTagName("con:config");
- for (i=0; i<ar.length; i++) {
- s = ar[i].getAttribute("resourcePath");
- if (s == arg(1)) ar[i].setAttribute("methodName", arg(2));
- }
- xmlDom.save(arg(0));
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |