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

[文本处理] [已解决]批处理如何在xml文件指定节点/元素/标签内插入/添加两行内容

[复制链接]
发表于 2017-4-28 18:46:33 | 显示全部楼层 |阅读模式
本帖最后由 pcl_test 于 2017-4-30 12:44 编辑

bat批处理于文件内区段插入两行指定内容,求教
有一 xyzxyz.xml文件内容约略如下
  1. <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
  2. <map>
  3.     <int name="Featured_Video_BottomID" value="436" />
  4.     <int name="Featured_Video_FirstID" value="444" />
  5.     <int name="Featured_Video_ID" value="443" />
  6.     <int name="News0" value="3452" />
  7.     <int name="News0_BottomID" value="3405" />
  8.     <int name="News0_FirstID" value="3456" />
  9.     <int name="News1" value="3405" />
  10.     <int name="News1_BottomID" value="3405" />
  11.     <int name="News1_FirstID" value="3444" />
  12. </map>
复制代码
需要在<map> ....... </map>区段内插入两行内容
  1.     <string name="apinfo">993684b8-801d-4b22-825c-db90e14b45a4</string>
  2.     <string name="email">myname123@163.com</string>
复制代码
使其文件最终效果为
  1. <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
  2. <map>
  3.     <int name="Featured_Video_BottomID" value="436" />
  4.     <int name="Featured_Video_FirstID" value="444" />
  5.     <int name="Featured_Video_ID" value="443" />
  6.     <int name="News0" value="3452" />
  7.     <int name="News0_BottomID" value="3405" />
  8.     <int name="News0_FirstID" value="3456" />
  9.     <int name="News1" value="3405" />
  10.     <int name="News1_BottomID" value="3405" />
  11.     <int name="News1_FirstID" value="3444" />
  12.     <string name="apinfo">993684b8-801d-4b22-825c-db90e14b45a4</string>
  13.     <string name="email">myname123@163.com</string>
  14. </map>
复制代码
翻阅了一些同类型问答,大多是于文件尾端加上
请教各位这样的.bat该怎样书写才行?麻烦指教了!

评分

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

查看全部评分

发表于 2017-4-29 17:29:04 | 显示全部楼层

  1. @echo off
  2. for /f "delims=" %%i in (xyzxyz.xml) do (
  3.     if not "%%i"=="</map>" echo,%%i
  4. )
  5. echo,    ^<string name="apinfo"^>993684b8-801d-4b22-825c-db90e14b45a4^</string^>
  6. echo,    ^<string name="email"^>myname123@163.com^</string^>
  7. echo,^</map^>
  8. pause
复制代码
发表于 2017-4-29 20:24:03 | 显示全部楼层
xmlstarlet这个工具很好用的样子。

http://batch-cn.qiniudn.com/s/tool/index.html?key=xml

xpath http://www.w3school.com.cn/xpath/xpath_functions.asp#node

XmlStarlet Command Line XML Toolkit User's Guide http://xmlstar.sourceforge.net/doc/UG/xmlstarlet-ug.html
  1. D:\.cache>xml ed -a //map/int[last()]  -t elem -n string -v test a.xml
  2. <?xml version="1.0" encoding="utf-8" standalone="yes"?>
  3. <map>
  4.   <int name="Featured_Video_BottomID" value="436"/>
  5.   <int name="Featured_Video_FirstID" value="444"/>
  6.   <int name="Featured_Video_ID" value="443"/>
  7.   <int name="News0" value="3452"/>
  8.   <int name="News0_BottomID" value="3405"/>
  9.   <int name="News0_FirstID" value="3456"/>
  10.   <int name="News1" value="3405"/>
  11.   <int name="News1_BottomID" value="3405"/>
  12.   <int name="News1_FirstID" value="3444"/>
  13.   <string>test</string>
  14. </map>
复制代码

评分

参与人数 1技术 +1 收起 理由
jamie + 1 感谢指导

查看全部评分

发表于 2017-4-29 20:24:25 | 显示全部楼层
发表于 2017-4-29 20:32:10 | 显示全部楼层
 楼主| 发表于 2017-4-30 03:39:22 | 显示全部楼层
本帖最后由 pcl_test 于 2017-4-30 08:28 编辑

回复 2# apython

抱歉再请教, 如果要将最终echo的结果输出到另一文件的话该怎么做?
 楼主| 发表于 2017-4-30 03:45:11 | 显示全部楼层
本帖最后由 pcl_test 于 2017-4-30 08:27 编辑

回复 3# codegay 这边的格式不太对,我按着上方的操作a.xml却没有输出结果 :funk:
发表于 2017-4-30 05:20:38 | 显示全部楼层
回复 6# jamie

  1. @echo off
  2. (for /f "delims=" %%i in (xyzxyz.xml) do (
  3.     if not "%%i"=="</map>" echo,%%i
  4. )
  5. echo,    ^<string name="apinfo"^>993684b8-801d-4b22-825c-db90e14b45a4^</string^>
  6. echo,    ^<string name="email"^>myname123@163.com^</string^>
  7. echo,^</map^>
  8. ) >new.xml
  9. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
jamie + 1 非常感谢,终于解决问题了

查看全部评分

发表于 2017-4-30 22:14:29 | 显示全部楼层
这种需求用正则替换比操作xml dom要简便些吧
  1. @echo off
  2. powershell ^
  3.     $file='测试.xml';$str='^<string name="apinfo"^>993684b8-801d-4b22-825c-db90e14b45a4^</string^>';^
  4.     $str+="`r`n"+'^<string name="email"^>myname123@163.com^</string^>'+"`r`n";^
  5.     [IO.File]::ReadAllText($file, [Text.Encoding]::UTF8) -replace '(?=^</map^>)',$str^|^
  6.     out-file ('New'+$file) -enc UTF8
  7. pause
复制代码
  1. //&cls&cscript -nologo -e:jscript "%~f0" "测试.xml"&pause&exit

  2. var file=WSH.Arguments(0);
  3. var arr=[['string','993684b8-801d-4b22-825c-db90e14b45a4','name','apinfo'],['string','myname123@163.com','name','email']];
  4. var xml=new ActiveXObject('Microsoft.XMLDOM');
  5. xml.async=false;
  6. xml.preserveWhiteSpace=true;
  7. xml.load(file);
  8. var map=xml.getElementsByTagName('map')[0];
  9. for(var i=0;i<arr.length;i++){
  10.     var e=xml.createElement(arr[i][0]);
  11.     e.text=arr[i][1];
  12.     e.setAttribute(arr[i][2], arr[i][3]);
  13.     map.appendChild(e);
  14. }
  15. xml.save('New_'+file);
复制代码

评分

参与人数 1技术 +1 收起 理由
jamie + 1 学习了,powershell强大

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 18:36 , Processed in 0.021233 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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