通过批处理从XML文件中删除标记

时间:2015-12-30 17:32:47

标签: xml batch-file

我需要从批处理文件中的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
)

3 个答案:

答案 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%

的文件

假设您的数据完全如上所述。

简单地说,使用>标记每一行。如果令牌与所需的令牌匹配,则回流该线的其余部分。