使用批处理文件从xml打印特定标记之间的字符串

使用批处理文件从xml打印特定标记之间的字符串,xml,batch-file,cmd,command-prompt,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> wsp

我有如下xml格式:

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

wsp1
特点1
我想打印标签
之间的所有字符串
我正在使用批处理文件使用以下命令:

    @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%
@echo关闭
setlocal enableextensions enabledelayedexpansion
设置“xmlFile=testing.xml”
对于/f“tokens=1,2 delims=:”%%n in('findstr/n/i/c:“%xmlFile%”)do(
对于('type“%xmlFile%”中的/f“tokens=*”%%l^更多+%%n),请设置“location=%%l”&转到endLoop
)
:endLoop
回显%位置%
但这只给了我第一个
wsp1

我只需要所有
标记之间的所有字符串

for /f "skip=2tokens=*" %a in ('find /v "<" q34149585.txt') do @echo %a
将结果放入新文件中


响应后:要求生成“name”标记下的所有条目列表,而不是“标记之间的所有字符串”

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

@ECHO关闭
SETLOCAL
设置“printme=”
设置“tagrequired=name”
对于(q34149585.txt)中的/f“tokens=*”%%a,请执行以下操作(
如果/i“%%a”==”设置“printme=”
如果定义了printme ECHO%%a
如果/i“%%a”==”设置“printme=Y”
)
后藤:EOF
我使用了一个名为
q34149585.txt
的文件,其中包含用于测试的数据

printme
在开始和遇到
时设置为无,遇到
时设置为
Y

那么-序列呢

<name>
    wsp1
</name>
将结果放入新文件中


响应后:要求生成“name”标记下的所有条目列表,而不是“标记之间的所有字符串”

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

@ECHO关闭
SETLOCAL
设置“printme=”
设置“tagrequired=name”
对于(q34149585.txt)中的/f“tokens=*”%%a,请执行以下操作(
如果/i“%%a”==”设置“printme=”
如果定义了printme ECHO%%a
如果/i“%%a”==”设置“printme=Y”
)
后藤:EOF
我使用了一个名为
q34149585.txt
的文件,其中包含用于测试的数据

printme
在开始和遇到
时设置为无,遇到
时设置为
Y

那么-序列呢

<name>
    wsp1
</name>

通常,将XML作为XML进行解析和操作比将其作为文本进行删减和修改更为优雅。这样,你就不会太依赖于预期你正在操作的文件的格式了,比如标签中间的断线。为此,我建议您使用Windows脚本主机并使用
Microsoft.XMLDOM
COM对象来操作XML DOM

下面的batch+JScript混合示例应使用.bat扩展名保存

@如果(@code节==@Batch)@那么
@回音
setlocal
cscript/nologo/e:JScript“%~f0”“test.xml”
后藤:EOF
@结束//结束批处理/开始JScript chimera
String.prototype.trim=function(){返回此.replace(/^\s+|\s+$/g,,);}
var DOM=WSH.CreateObject('Microsoft.XMLDOM'),
xmlfile=WSH.Arguments(0),
XPath=“//名称/文本()”;
load(xmlfile);
DOM.async=false;
setProperty('SelectionLanguage','XPath');
对于(var d=DOM.selectNodes(XPath),i=0;i
如果愿意,可以通过在
DOM.setProperty
行下方插入以下内容,添加XML文件验证以更好地处理错误:

if(DOM.parseError.errorCode){
var e=DOM.parseError;
WSH.StdErr.WriteLine(“+xmlfile+”行“+e.line+”字符”中的错误)
+e.linepos+':\n'+e.reason+'\n'+e.srcText);
退出(1);
}
如果希望文本位于两个不同的标记之间,只需更改XPath选择器。要在名为
tag1
tag2
的标记中搜索,如下所示:

XPath=“//*[self::tag1或self::tag2]/text()”;

通常,将XML作为XML进行解析和操作比将其作为文本进行删减和修改更为优雅。这样,你就不会太依赖于预期你正在操作的文件的格式了,比如标签中间的断线。为此,我建议您使用Windows脚本主机并使用
Microsoft.XMLDOM
COM对象来操作XML DOM

下面的batch+JScript混合示例应使用.bat扩展名保存

@如果(@code节==@Batch)@那么
@回音
setlocal
cscript/nologo/e:JScript“%~f0”“test.xml”
后藤:EOF
@结束//结束批处理/开始JScript chimera
String.prototype.trim=function(){返回此.replace(/^\s+|\s+$/g,,);}
var DOM=WSH.CreateObject('Microsoft.XMLDOM'),
xmlfile=WSH.Arguments(0),
XPath=“//名称/文本()”;
load(xmlfile);
DOM.async=false;
setProperty('SelectionLanguage','XPath');
对于(var d=DOM.selectNodes(XPath),i=0;i
如果愿意,可以通过在
DOM.setProperty
行下方插入以下内容,添加XML文件验证以更好地处理错误:

if(DOM.parseError.errorCode){
var e=DOM.parseError;
WSH.StdErr.WriteLine(“+xmlfile+”行“+e.line+”字符”中的错误)
+e.linepos+':\n'+e.reason+'\n'+e.srcText);
退出(1);
}
如果希望文本位于两个不同的标记之间,只需更改XPath选择器。要在名为
tag1
tag2
的标记中搜索,如下所示:

XPath=“//*[self::tag1或self::tag2]/text()”;

下载xidel,它可以执行xpath:

xidel file.xml -e "//name"

下载xidel,它可以执行以下操作:

xidel file.xml -e "//name"

这将如何在特定标记之间找到字符串?如果我有另一个标记,假设标记中有file1,这将给出错误的输出。不过,谢谢你的代码。我相信你的回答会有帮助的。这正是我想要的如果我想针对多个标记,它是否有效?这将如何仅在特定标记之间找到字符串?如果我有另一个标记,则假定