Board logo

标题: [文本处理] 批处理如何将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
  1. $a = (Get-Content a) -match "ccc" -replace ".*[<]ccc[>](.+)[<]/ccc[>].*","`$1"
  2. (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