Board logo

标题: [文件操作] [已解决]批处理如何删除XML文件的指定节点/标签/元素? [打印本页]

作者: 001011    时间: 2012-3-17 15:56     标题: [已解决]批处理如何删除XML文件的指定节点/标签/元素?

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

我要删除XML文件的几个节点,他们分别是
<dc:title1></dc:title1>
<dc:title2></dc:title2>
<dc:title3></dc:title3>
<publisher1></publisher1>
<contributor1></contributor1>
<relation1></relation1>
这些节点有可能是有值的  也有可能是空值
文件路径在附件中


谢谢各位老师
作者: find    时间: 2012-3-17 17:05

能否上传一个XML文件让我测试一下代码?
作者: 001011    时间: 2012-3-17 17:09

在附件中呀
作者: find    时间: 2012-3-17 17:38

  1. sed -i "s#<dc:title1>[^<]\+</dc:title1>##" dc.xml
复制代码

作者: 001011    时间: 2012-3-17 17:53

没有什么效果呀
作者: find    时间: 2012-3-17 18:10

回复 5# 001011


你用的哪个版本的sed?
作者: 001011    时间: 2012-3-17 18:18

凡事带数字的节点  都是辅助节点  用完后就要删除
作者: find    时间: 2012-3-17 18:42

回复 7# 001011


我的用的一个软件做的这些文件
这些文件是UTF-8格式的
sed我没有用
谢谢您

sed你没用那现在就用一下吧
不用单独发消息给我,你直接回复我的帖子,论坛会自动提醒我。
作者: find    时间: 2012-3-17 18:44

  1. sed -i "s#<dc:title1>[^<]\+</dc:title1>##; s#<dc:title2>[^<]\+</dc:title2>##" dc.xml
复制代码
其它节点照着这个格式继续就行了
作者: 001011    时间: 2012-3-17 19:12

抱歉 我实在是不知道怎么用   复制到BAT里面运行吗
作者: terse    时间: 2012-3-17 19:49

回复 10# 001011
需要外部命令 SED.EXE
  1. @echo off
  2. for /f %%i in ('dir /b /a-d /s "E:\a\dc.xml" "E:\a\a.opf"') do (
  3. sed -i "s/<dc:title1>.*<\/dc:title1>//g;s/<dc:title2>.*<\/dc:title2>//g;s/<dc:title3>.*<\/dc:title3>//g;s/<publisher1>.*<\/publisher1>//g;s/<contributor1>.*<\/dc:contributor1>//g;s/<relation1>.*<\/relation1>//g" "%%i"
  4. )
  5. pause
复制代码

作者: find    时间: 2012-3-17 20:01

回复 10# 001011


是的,把sed.exe和test.bat放在同一个目录
作者: powerbat    时间: 2012-3-17 22:08

sed好像不支持utf-8吧。
使用前注意备份。
  1. @set @n=0//& cscript.exe -e:jscript "%~f0" &pause&exit/b
  2. strQuery = "select name from CIM_DataFile where "
  3.     + " drive='E:' and path like '\\\\A\\\\%' and ("
  4.     + "(filename='a' and extension='opf') or "
  5.     + "(filename='dc' and extension='xml'))";
  6. wmi = new ActiveXObject("WbemScripting.SWbemLocator").ConnectServer();
  7. colFiles = wmi.ExecQuery(strQuery, "WQL", 48);
  8. e = new Enumerator(colFiles);
  9. for (; !e.atEnd(); e.moveNext())
  10. {
  11.     f = e.item().name;
  12.     s = readtext(f);
  13.     s = s.replace(/<dc:title1>[^<>]*<\/dc:title1>|<dc:title2>[^<>]*<\/dc:title2>|<dc:title3>[^<>]*<\/dc:title3>|<publisher1>[^<>]*<\/publisher1>|<contributor1>[^<>]*<\/dc:contributor1>|<relation1>[^<>]*<\/relation1>/g, '');
  14.     writetext(f, s);
  15. }
  16. function readtext(file, charset)
  17. {
  18.     var text;
  19.     var aso = new ActiveXObject('ADODB.Stream');
  20.     aso.Mode = 3;
  21.     aso.Type = 2;
  22.     if (charset) aso.Charset = charset;
  23.     else aso.Charset = 'utf-8';
  24.     aso.Open();
  25.     aso.LoadFromFile(file);
  26.     text = aso.ReadText(-1);
  27.     aso.Close();
  28.     aso = null;
  29.     return text;
  30. }
  31. function writetext(file, text, charset)
  32. {
  33.     var aso = new ActiveXObject('ADODB.Stream');
  34.     aso.Mode = 3;
  35.     aso.Type = 2;
  36.     if (charset) aso.Charset = charset;
  37.     else aso.Charset = 'utf-8';
  38.     aso.Open();
  39.     aso.WriteText(text);
  40.     aso.SaveToFile(file, 2);
  41.     aso.Close();
  42.     aso = null;
  43. }
复制代码

作者: 001011    时间: 2012-3-18 15:27

非常感谢 代码执行正常
作者: 001011    时间: 2012-3-18 15:47

本帖最后由 001011 于 2012-3-18 17:41 编辑

回复 13# powerbat


    能否再麻烦您一下啊   把您的代码放到下面的程序里面运行 免得要运行两个程序
作者: 001011    时间: 2012-3-19 22:10

再次顶贴  盼高手飘过
作者: powerbat    时间: 2012-3-19 22:56

回复 15# 001011


    把第一行改成
  1. @set @n=0/*& echo off
  2. cscript.exe -e:jscript "%~f0"
  3. rem add your code here
  4. rem ...
  5. pause
  6. exit/b
  7. */
复制代码

作者: 001011    时间: 2012-3-19 23:18

回复 17# powerbat
改了以后放到VBS里面吗
作者: powerbat    时间: 2012-3-20 00:13

回复 18# 001011


    改了后整个代码保存为一个bat文件。这是 bat + js 二合一。
作者: 001011    时间: 2012-3-20 10:21

哦  谢谢您咯




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