[英]Delete tags from an XML file via batch
我需要从批处理文件中的XML文件中删除<batchRequest>
和</batchRequest>
。
可能吗?
我当前的文件:
<batchRequest><sid sid="100000000" test="false" ></sid>
</batchRequest>
<batchRequest><sid sid="100000000" test="false" ></sid>
</batchRequest>
我需要这个:
<sid sid="100000000" test="false" ></sid>
<sid sid="100000000" test="false" ></sid>
我被这个设置卡住了
set str=!str:<batchRequest>=!
如果我用
set str=!str:batchRequest=!
它有效,但不是我所需要的。
到目前为止,我的代码:
@echo on
setlocal enabledelayedexpansion
For /f "tokens=* delims= " %%a in (_1000_1008603__30122015_153242_all.xml) do (
Set str=%%a
set str=!str:<batchRequest>=!
echo !str!>>_1000_1008603__30122015_153242_all_NEW.xml
)
诸如搜索和替换之类的字符串操作不足以处理XML文件,您迟早会破坏文件,最有可能早就破坏文件。
使用支持XML的工具,最适合您的任务的工具是XSLT。
以下转换将删除<batchRequest>
元素,并使文档的其余部分保持不变:
<!-- removeBatchRequest.xsl -->
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="batchRequest">
<xsl:apply-templates select="@*|node()" />
</xsl:template>
</xsl:transform>
与命令行XSL处理器一起使用以进行批处理支持。 Microsoft的(日期可靠) msxsl.exe可以完美地完成工作。
这是我在上面的评论中提到的代码。 使用MSXML.DOMDocument.6.0
COM对象来解析XML DOM使用常用DOM方法操纵它- .insertBefore
搬迁内部节点,然后.removeChild
删除不需要的,现在空标签。 如果您曾经为网页编写过JavaScript,那么这些方法可能已经很熟悉了。 这是一个批处理+ JScript混合示例。 用.bat扩展名保存。
@if (@CodeSection == @Batch) @then
@echo off & setlocal
for %%I in (*.xml) do cscript /nologo /e:Jscript "%~f0" "%%~I"
exit /b & @end // end batch; begin JScript hybrid chimera
var DOM = WSH.CreateObject('MSXML2.DOMDocument.6.0'),
XMLfile = WSH.Arguments(0);
DOM.load(XMLfile);
if (DOM.parseError.errorCode) {
var e = DOM.parseError;
WSH.StdErr.WriteLine('Error in ' + XMLfile + ' line ' + e.line + ' char '
+ e.linepos + ':\n' + e.reason + '\n' + e.srcText);
WSH.Quit(1);
}
var bads = DOM.selectNodes('//batchRequest');
for (var i = bads.length; bad = bads[--i];) {
while (bad.hasChildNodes())
bad.parentNode.insertBefore(bad.firstChild, bad);
bad.parentNode.removeChild(bad);
}
DOM.save(XMLfile);
该方法的一大优势是Windows已经内置了所有必需的库和引擎。 无需下载和安装任何其他实用程序。 如果您的XML有问题,它也很快并且提供了更详细的错误报告。 (如果您有许多Scripting.FileSystemObject
,则使用Scripting.FileSystemObject
纯JScript或VBScript解决方案可以更快地循环浏览文件,但是使用批处理for
循环使此演示更加简单。)
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "filename1=%sourcedir%\q34534274.txt"
SET "outfile=%destdir%\outfile.txt"
(
FOR /f "usebackqtokens=1*delims=>" %%a IN ("%filename1%") DO (
IF "%%a"=="<batchRequest" ECHO %%b
)
)>"%outfile%"
GOTO :EOF
您需要更改sourcedir
destdir
的设置以适合您的情况。
我使用了一个名为q34534274.txt
的文件, q34534274.txt
包含用于测试的数据。
产生定义为%outfile%的文件
假设您的数据与描述完全相同。
只需使用>
标记每行。 如果令牌与所需令牌匹配,请对其余行进行反流。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.