Board logo

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

作者: jamie    时间: 2017-4-28 18:46     标题: [已解决]批处理如何在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该怎样书写才行?麻烦指教了!
作者: apython    时间: 2017-4-29 17:29

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

作者: codegay    时间: 2017-4-29 20:24

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

作者: codegay    时间: 2017-4-29 20:24

XMLStarlet 使用入门
https://www.ibm.com/developerworks/cn/xml/x-starlet.html
作者: codegay    时间: 2017-4-29 20:32

PowerShell处理XML http://www.pstips.net/loading-and-processing-xml-files.html
作者: jamie    时间: 2017-4-30 03:39

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

回复 2# apython

抱歉再请教, 如果要将最终echo的结果输出到另一文件的话该怎么做?
作者: jamie    时间: 2017-4-30 03:45

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

回复 3# codegay 这边的格式不太对,我按着上方的操作a.xml却没有输出结果 :funk:
作者: apython    时间: 2017-4-30 05:20

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

作者: pcl_test    时间: 2017-4-30 22:14

这种需求用正则替换比操作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);
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2