我的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>
个标签之间使用所有字符串。
答案 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选择器即可。要搜索名为tag1
和tag2
的标记,它将如下所示:
XPath = "//*[self::tag1 or self::tag2]/text()";
答案 2 :(得分:1)
下载xidel,可以执行xpath:
xidel file.xml -e "//name"