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

[文本处理] 批处理如何将xml文件中的属性值提取并替换到另一个xml的属性值?[已解决]

[复制链接]
发表于 2021-7-8 09:26:39 | 显示全部楼层 |阅读模式
本帖最后由 夜夜夜 于 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>
发表于 2021-7-8 13:58:19 | 显示全部楼层
@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

评分

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

查看全部评分

发表于 2021-7-8 14:34: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:29 | 显示全部楼层
回复 2# idwma


   我发现B.xml中如果有<!--测试-->的注释内容的话,新生成的C里面会去掉这个感叹号,文件就不能正常打开了,这个应该怎么处理呀?而且替换值里面有中文的话,会有乱码,好像跟脚本里面写的尾置数字大小有关,请教怎么处理
发表于 2021-7-8 15:19:54 | 显示全部楼层
!号的问题用这个,中文乱码先把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
发表于 2021-7-8 15:37:06 | 显示全部楼层
发现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:10 | 显示全部楼层
本帖最后由 夜夜夜 于 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>
发表于 2021-7-8 15:57:58 | 显示全部楼层
本帖最后由 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

评分

参与人数 1技术 +1 收起 理由
夜夜夜 + 1 感谢分享

查看全部评分

 楼主| 发表于 2021-7-8 16:10:31 | 显示全部楼层
回复 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:09 | 显示全部楼层
本帖最后由 夜夜夜 于 2021-7-8 17:02 编辑

回复 8# idwma


    已经解决了,多谢大佬。
发表于 2021-7-8 19:22:56 | 显示全部楼层
本帖最后由 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]
复制代码
发表于 2021-7-8 19:41:04 | 显示全部楼层
用正则表达式,可以避免批处理的坑,特殊字符太麻烦
 楼主| 发表于 2021-7-9 13:11:49 | 显示全部楼层
回复 12# newswan


    好的,感谢分享
发表于 2021-7-20 13:22:35 | 显示全部楼层
回复 1# 夜夜夜


    已解决应该放到前面
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-20 19:52 , Processed in 0.036320 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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