标题: [文本处理] 批处理如何将xml文件中的属性值提取并替换到另一个xml的属性值?[已解决] [打印本页]
作者: 夜夜夜 时间: 2021-7-8 09:26 标题: 批处理如何将xml文件中的属性值提取并替换到另一个xml的属性值?[已解决]
本帖最后由 夜夜夜 于 2021-7-8 14:21 编辑
如何提取A.xml中的属性值替换到B.xml中对应的位置,希望得到的是C.xml。B.xml包含了A.xml的内容,并且有新增内容,如将A中的192.168.1.1替换B中的255.255.255.255。指定提取并替换A中的几项到B中。
想法是:根据</ccc>找到A中所在行的位置,用变量存下此行内容,同样根据</ccc>找到B中所所在行的位置,然后用变量替换这一行的内容。请教大佬怎么做!
A.xml文件内容:
<?xml version="1.0" encoding="utf-8"?>
<aaa>
<bbb>
<ccc>192.168.1.1</ccc>
<ddd>80</ddd>
</bbb>
<eee>
<fff>debug</fff>
</eee>
</aaa>
B.xml文件内容:
<?xml version="1.0" encoding="utf-8"?>
<aaa>
<bbb>
<ccc>255.255.255.255</ccc>
<ddd>443</ddd>
</bbb>
<ggg>
<hhh>test1</hhh>
</ggg>
<eee>
<fff>release</fff>
</eee>
</aaa>
希望得到的C.xml:
<?xml version="1.0" encoding="utf-8"?>
<aaa>
<bbb>
<ccc>192.168.1.1</ccc>
<ddd>80</ddd>
</bbb>
<ggg>
<hhh>test1</hhh>
</ggg>
<eee>
<fff>debug</fff>
</eee>
</aaa>
作者: idwma 时间: 2021-7-8 13:58
@echo off&setlocal enabledelayedexpansion
set a=a.xml
set b=b.xml
set c=c.xml
for /f "delims=" %%i in (!b!) do (
set str=%%i
if "!str:~-6!" == "</ccc>" (type !a! | find "</ccc>"
) else (
if "!str:~-6!" == "</ddd>" (type !a! | find "</ddd>"
) else (
if "!str:~-6!" == "</fff>" (type !a! | find "</fff>"
) else (
if "!str:~-2!" == "?>" (echo;^<?xml version="1.0" encoding="utf-8"?^> &rem;如果ab文件是utf8格式会出现乱码,这里替换第一行
) else (
echo;%%i))))
)>>!c!
pause
作者: idwma 时间: 2021-7-8 14:34
再来一个不太友好的
@echo off&setlocal enabledelayedexpansion
set a=a.xml
set b=b.xml
set c=c.xml
for /f "delims=" %%i in (!b!) do (
set str=%%i
(echo;"%%i" | find "</ccc>" >nul && type !a! | find "</ccc>"
) || (
echo;"%%i" | find "</ddd>" >nul && type !a! | find "</ddd>"
) || (
echo;"%%i" | find "</fff>" >nul && type !a! | find "</fff>"
) || (
echo;"%%i" | find "utf-8" >nul && echo;^<?xml version="1.0" encoding="utf-8"?^>
) || (echo;%%i)
)>>!c!
pause
作者: 夜夜夜 时间: 2021-7-8 15:01
回复 2# idwma
我发现B.xml中如果有<!--测试-->的注释内容的话,新生成的C里面会去掉这个感叹号,文件就不能正常打开了,这个应该怎么处理呀?而且替换值里面有中文的话,会有乱码,好像跟脚本里面写的尾置数字大小有关,请教怎么处理
作者: idwma 时间: 2021-7-8 15:19
!号的问题用这个,中文乱码先把ab两个xml文件另存为ansi格式
@echo off
set a=a.xml
set b=b.xml
set c=c.xml
for /f "delims=" %%i in (%b%) do (
(echo;"%%i" | find "</ccc>" >nul && type %a% | find "</ccc>"
) || (
echo;"%%i" | find "</ddd>" >nul && type %a% | find "</ddd>"
) || (
echo;"%%i" | find "</fff>" >nul && type %a% | find "</fff>"
) || (
echo;"%%i" | find "utf-8" >nul && echo;^<?xml version="1.0" encoding="utf-8"?^>
) || (echo;%%i)
)>>%c%
pause
作者: idwma 时间: 2021-7-8 15:37
发现findstr可以输出utf8中文不乱码不用改文件格式了
@echo off
set a=a.xml
set b=b.xml
set c=c.xml
for /f "delims=" %%i in ('findstr ".*" %b%') do (
(echo;"%%i" | findstr "</ccc>" >nul && type %a% | findstr "</ccc>"
) || (
echo;"%%i" | findstr "</ddd>" >nul && type %a% | findstr "</ddd>"
) || (
echo;"%%i" | findstr "</fff>" >nul && type %a% | findstr "</fff>"
) || (
echo;"%%i" | findstr "utf-8" >nul && echo;^<?xml version="1.0" encoding="utf-8"?^>
) || (echo;%%i)
)>>%c%
pause
作者: 夜夜夜 时间: 2021-7-8 15:38
本帖最后由 夜夜夜 于 2021-7-8 15:56 编辑
回复 5# idwma
能否不生成新的文件C,直接替换到B中的内容呀,这样就不用转换文本格式了。求助大佬!
如下内容的转化,总是乱码,修正一下文本内容。
A内容:
<?xml version="1.0" encoding="utf-8"?>
<aaa>
<bbb>
<ccc>192.168.1.1</ccc>
<!--测试端口-->
<ddd>80</ddd>
</bbb>
<notice>
<type flag="1">信息</type>
<type flag="2">安全风险销号</type>
</notice>
<type>
<eee>
<fff>debug</fff>
<!--是否按文件类型过滤-->
</eee>
</aaa>
B内容:
<?xml version="1.0" encoding="utf-8"?>
<aaa>
<bbb>
<ccc>255.255.255.255</ccc>
<!--测试端口-->
<ddd>443</ddd>
</bbb>
<notice>
<type flag="1">信息</type>
<type flag="2">安全风险销号</type>
</notice>
<type>
<eee>
<fff>release</fff>
<!--是否按文件类型过滤-->
</eee>
</aaa>
作者: idwma 时间: 2021-7-8 15:57
本帖最后由 idwma 于 2021-7-8 16:08 编辑
不乱了,再改一下
@echo off
chcp 65001
set a=a.xml
set b=b.xml
set c=c.xml
for /f "delims=" %%i in ('findstr /r ".*" %b%') do (
(echo;"%%i" | findstr /r "</ccc>" >nul && findstr /r "</ccc>" %a%
) || (
echo;"%%i" | findstr /r "</ddd>" >nul && findstr /r "</ddd>" %a%
) || (
echo;"%%i" | findstr /r "</fff>" >nul && findstr /r "</fff>" %a%
) || (
echo;"%%i" | findstr /r "utf-8" >nul && findstr /r "utf-8" %a%
) || (echo;%%i)
)>>%c%
pause
作者: 夜夜夜 时间: 2021-7-8 16:10
回复 8# idwma
我测试这个,还是有乱码的情况。求助,辛苦了。
A内容:
<?xml version="1.0" encoding="utf-8"?>
<aaa>
<bbb>
<ccc>192.168.1.1</ccc>
<!--测试端口-->
<ddd>80</ddd>
</bbb>
<notice>
<type flag="1">信息</type>
<type flag="2">安全风险销号</type>
</notice>
<type>
<eee>
<fff>debug</fff>
<!--是否按文件类型过滤-->
</eee>
</aaa>
B内容:
<?xml version="1.0" encoding="utf-8"?>
<aaa>
<bbb>
<ccc>255.255.255.255</ccc>
<!--测试端口-->
<ddd>443</ddd>
</bbb>
<notice>
<type flag="1">信息</type>
<type flag="2">安全风险销号</type>
</notice>
<type>
<eee>
<fff>release</fff>
<!--是否按文件类型过滤-->
</eee>
</aaa>
作者: 夜夜夜 时间: 2021-7-8 16:55
本帖最后由 夜夜夜 于 2021-7-8 17:02 编辑
回复 8# idwma
已经解决了,多谢大佬。
作者: newswan 时间: 2021-7-8 19:22
本帖最后由 newswan 于 2021-7-8 19:38 编辑
powershell- $a = (Get-Content a) -match "ccc" -replace ".*[<]ccc[>](.+)[<]/ccc[>].*","`$1"
- (Get-Content b) -replace "(?<=.*[<]ccc[>])(.+)(?=[<]/ccc[>].*)",$a[0]
复制代码
作者: newswan 时间: 2021-7-8 19:41
用正则表达式,可以避免批处理的坑,特殊字符太麻烦
作者: 夜夜夜 时间: 2021-7-9 13:11
回复 12# newswan
好的,感谢分享
作者: cmd1152 时间: 2021-7-20 13:22
回复 1# 夜夜夜
已解决应该放到前面
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |