如何用批处理 替换xml指定节点的内容?

现在有两个文件:
文件1:a.xml
<file>
<mail>aaa@163.com</mail>
</file>

文件2: b.txt
zhangsan@126.com
lisi@163.com
wangwu@sina.com
zhaoliu@163.com
tianqi@163.com

需求是批处理文件test.bat,循环的按行读取b.txt中的内容替换a.xml中<mail>节点中的mail地址。
例如,第一次执行test.bat,读取b.txt第一行zhangsan@126.com,替换<mail>节点中的mail地址:aaa@163.com
第二次执行test.bat,读取b.txt第一行lisi@163.com,替换<mail>节点中的mail地址:hangsan@126.com
以此下去,当一轮替换完后重新读取第一行mail替换。

批处理还不太懂,希望批处理大侠们帮帮忙,谢谢

如果您的a.xml文件样式固定,那倒好办了。
写一个批处理test.bat:
@echo off
@setlocal enabledelayedexpansion
@if exist a_bak.xml @del a_bak.xml
@ren b.txt b_old.txt
@ren a.xml a_bak.xml
@set li=1
@for /f %%i in (b_old.txt) do (
@set nm=%%i
if !li!==1 (
@echo ^<file^> >> a.xml
@echo ^<mail^>!nm!^<^/mail^> >> a.xml
@echo ^<^/file^> >> a.xml
) else (
@echo !nm! >> b.txt
)
@set /a li+=1
)
把test.bat与a.xml和b.txt放在一个文件夹下面,由于这段代码会重写a.xml和b.txt,因此先复制一份b.txt,防止您的list丢了。
然后每次执行test.bat时:
1、将当前a.xml和b.txt存为a_bak.xml和b_old.txt;
2、b.txt的第一行会替换a.xml中<mail>节点内容;
3、删除原有b.txt的第一行,存为新的b.txt。
只要执行过一次,除去您的“b.txt复件”,应该文件夹中有4个文件:
a.xml、a_bak.xml、b.txt、b_old.txt;
其中,a.xml永远是您最后一次生成的文件,b.txt是您接下来要用的列表;另外两个是为了防止意外帮您留的。
上述代码,已在XP下测试通过。追问

你好,非常感谢你的回答,我测试了一下,第一次执行test.bat,b.txt的第一行被删掉,a.xml 替换成功。第二次执行test.bat,a.xml 依然是zhangsan@126.com,b.txt 变成了:
lisi@163.com
wangwu@sina.com
zhaoliu@163.com
tianqi@163.com
lisi@163.com
wangwu@sina.com
zhaoliu@163.com
tianqi@163.com
请你帮忙解决一下,如果能够实现。b.txt 可以随意定义,excle , xml 格式都可以,谢谢!

追答

不好意思,按最后思路改版时,少了一行。现在更正test.bat的内容:
@echo off
@setlocal enabledelayedexpansion
@if exist a_bak.xml @del a_bak.xml
@if exist b_old.txt @del b_old.txt
@ren b.txt b_old.txt
@ren a.xml a_bak.xml
@set li=1
@for /f %%i in (b_old.txt) do (
@set nm=%%i
if !li!==1 (
@echo ^ >> a.xml
@echo ^!nm!^ >> a.xml
@echo ^ >> a.xml
) else (
@echo !nm! >> b.txt
)
@set /a li+=1
)

追问

在最后替换后a.xml & b.text 都没删掉了

追答

如果处理前b.txt里只有一行了,最后就不再生成b.txt了,相当于清了。如果想最后清理a.xml,bat改为如下内容:
@echo off
@if not exist b.txt (
@del a.xml
@goto X
@setlocal enabledelayedexpansion
@if exist a_bak.xml @del a_bak.xml
@if exist b_old.txt @del b_old.txt
@ren b.txt b_old.txt
@ren a.xml a_bak.xml
@set li=1
@for /f %%i in (b_old.txt) do (
@set nm=%%i
if !li!==1 (
@echo ^ >> a.xml
@echo ^!nm!^ >> a.xml
@echo ^ >> a.xml
) else (
@echo !nm! >> b.txt
)
@set /a li+=1
)
:X

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-04-20
没必要执行N次,完全可以一次执行就处理完所有的。
相似回答