[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

本帖最后由 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该怎样书写才行?麻烦指教了!
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

这种需求用正则替换比操作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

评分人数

    • jamie: 学习了,powershell强大技术 + 1

TOP

回复 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

评分人数

    • jamie: 非常感谢,终于解决问题了技术 + 1

TOP

本帖最后由 pcl_test 于 2017-4-30 08:27 编辑

回复 3# codegay 这边的格式不太对,我按着上方的操作a.xml却没有输出结果 :funk:

TOP

本帖最后由 pcl_test 于 2017-4-30 08:28 编辑

回复 2# apython

抱歉再请教, 如果要将最终echo的结果输出到另一文件的话该怎么做?

TOP

去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

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

评分人数

    • jamie: 感谢指导技术 + 1
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

  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
复制代码

TOP

返回列表