使用批处理文件在xml中的特定Tag之间打印字符串

时间:2015-12-08 06:41:41

标签: xml batch-file cmd command-prompt

我的xml格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<data>
<wsp1>
    <name>
        wsp1
    </name>
</wsp1>
<feature1>
    <name>
        feature1
    </name>
</feature1>
</data>

我想打印标记<name></name>之间的所有字符串 我正在使用以下命令使用批处理文件:

    @echo off
    setlocal enableextensions enabledelayedexpansion
    set "xmlFile=testing.xml"
    for /f "tokens=1,2 delims=:" %%n in ('findstr /n /i /c:"<name>" "%xmlFile%"') do (
        for /f "tokens=*" %%l in ('type "%xmlFile%" ^| more +%%n') do set "location=%%l" & goto endLoop
    )
:endLoop
    echo %location%

但这只给我wsp1

我只想在所有<name>个标签之间使用所有字符串。

3 个答案:

答案 0 :(得分:2)

for /f "skip=2tokens=*" %a in ('find /v "<" q34149585.txt') do @echo %a
提示中的

应该按照您的要求进行。

&#34;发现&#34;找到包含<的所有行,但输出前面有两行 - 一行空白,另一行带文件名,因此skip=2删除这些行。

您需要更改文件名以适合您的具体情况。

(for /f "skip=2tokens=*" %a in ('find /v "<" q34149585.txt') do @echo %a)>outfilename.txt

会将结果放入新文件中。

回复后:要求是在&#34; name&#34;下生成所有条目的列表。 tag,not&#34;标记&#34;

之间的所有字符串

如果您要在其他标签之间添加数据并显示所需的输出,这将有所帮助。

@ECHO Off
SETLOCAL
SET "printme="
SET "tagrequired=name"
FOR /f "tokens=*" %%a IN (q34149585.txt) DO (
 IF /i "%%a"=="</%tagrequired%>" SET "printme="
 IF DEFINED printme ECHO %%a
 IF /i "%%a"=="<%tagrequired%>" SET "printme=Y"
)

GOTO :EOF

我使用了一个名为q34149585.txt的文件,其中包含我的测试数据。

printme在开始时以及在遇到</name>时遇到Y<name>时设置为

所以 - 序列

<name>
    wsp1
</name>

会将printme设置为Y,然后显示数据值,然后将printme设置为 nothing if defined适用于当前(运行时)值。

调整fot tag1或tag2

@ECHO Off
SETLOCAL
SET "printme="
SET "tagrequired=name"
SET "tag2=whatever"
FOR /f "tokens=*" %%a IN (q34149585.txt) DO (
 IF /i "%%a"=="</%tagrequired%>" SET "printme="
 IF /i "%%a"=="</%tag2%>" SET "printme="
 IF DEFINED printme ECHO %%a
 IF /i "%%a"=="<%tagrequired%>" SET "printme=Y"
 IF /i "%%a"=="<%tag2%>" SET "printme=Y"
)

GOTO :EOF

答案 1 :(得分:1)

将XML作为XML进行解析和操作通常更为优雅,而不是作为文本进行刮擦和破解。这样,您就不会如此依赖于预测您操作的文件的格式 - 例如,标签中间的换行符。为此,我建议您使用Windows Scripting Host并使用Microsoft.XMLDOM COM对象来操作XML DOM。

以下批处理+ JScript混合示例应使用.bat扩展名保存。

@if (@CodeSection == @Batch) @then

@echo off
setlocal

cscript /nologo /e:JScript "%~f0" "test.xml"

goto :EOF
@end // end batch / begin JScript chimera

String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); }

var DOM = WSH.CreateObject('Microsoft.XMLDOM'),
    xmlfile = WSH.Arguments(0),
    XPath = "//name/text()";

DOM.load(xmlfile);
DOM.async = false;
DOM.setProperty('SelectionLanguage', 'XPath');

for (var d = DOM.selectNodes(XPath), i = 0; i < d.length; i++)
    WSH.Echo(d[i].data.trim());

如果您愿意,可以添加XML文件的验证,以便通过在DOM.setProperty行下面插入来更好地处理错误:

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);
}

如果您想要两个不同标签之间的文本,只需更改XPath选择器即可。要搜索名为tag1tag2的标记,它将如下所示:

XPath = "//*[self::tag1 or self::tag2]/text()";

答案 2 :(得分:1)

下载xidel,可以执行xpath:

xidel file.xml -e "//name"