繁体   English   中英

通过批量删除XML文件中的标签

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM