我需要从批处理文件中的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
)
答案 0 :(得分:1)
搜索和替换之类的字符串操作不适用于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处理器一起用于批处理支持。 (过时但可靠)msxsl.exe from Microsoft完美地完成了这项工作。
答案 1 :(得分:0)
这是我在上面评论中提到的代码。使用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
的纯JScript或VBScript解决方案可以更快地遍历文件,但是使用批处理for
循环可以使这个演示更加简单。)
答案 2 :(得分:0)
@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
的文件,其中包含我的测试数据。
生成定义为%outfile%
的文件假设您的数据完全如上所述。
简单地说,使用>
标记每一行。如果令牌与所需的令牌匹配,则回流该线的其余部分。