Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何使用Windows批处理提取特定XML标记属性的所有实例_Batch File - Fatal编程技术网

Batch file 如何使用Windows批处理提取特定XML标记属性的所有实例

Batch file 如何使用Windows批处理提取特定XML标记属性的所有实例,batch-file,Batch File,我有一个XML文件,需要提取 testname 从所有的 <con:testSuite name="testname" 使用批处理解析XML非常痛苦。批处理从一开始就不是一个好的文本处理器。但是,只要付出一定的努力,通常可以从给定的XML文件中提取所需的数据。但是输入文件可以很容易地重新排列为等效的有效XML格式,这将破坏您的解析器 有了这个免责声明 这是一个本机批处理解决方案 @echo off setlocal disableDelayedExpansion set input=

我有一个XML文件,需要提取

testname
从所有的

<con:testSuite name="testname" 

使用批处理解析XML非常痛苦。批处理从一开始就不是一个好的文本处理器。但是,只要付出一定的努力,通常可以从给定的XML文件中提取所需的数据。但是输入文件可以很容易地重新排列为等效的有效XML格式,这将破坏您的解析器

有了这个免责声明

这是一个本机批处理解决方案

@echo off
setlocal disableDelayedExpansion
set input="test.xml"
set output="names.txt"

if exist %output% del %output%
for /f "delims=" %%A in ('findstr /n /c:"<con:testSuite name=" %input%') do (
  set "ln=%%A"
  setlocal enableDelayedExpansion
  call :parseLine
  endlocal
)
type %output%
exit /b

:parseLine
set "ln2=!ln:*<con:testSuite name=!"
if "!ln2!"=="!ln!" exit /b
for /f tokens^=2^ delims^=^" %%B in ("!ln2!") do (
  setlocal disableDelayedExpansion
  >>%output% echo(%%B
  endlocal
)
set "ln=!ln2!"
goto :parseLine
FINDSTR正在使用正则表达式元字符
^
来指定字符串必须以
lp
开头。现在引号已经被删除了,所以我们不必担心它们

但是,您将来可能会遇到这样的情况:您必须在搜索字符串中包含
。此外,在初始FINDSTR中包含
lp
屏幕可能会稍微快一些,这样就不会不必要地调用
:parseLine

FINDSTR要求搜索字符串双引号用反斜杠转义。但是Windows CMD处理器也有自己的转义规则。像
这样的特殊字符需要被引用或转义。原始代码使用引号,但您希望在字符串中包含引号,这会在c语言中创建不平衡的引号ommand.Windows批处理通常喜欢成对的引号。CMD必须将至少一个引号转义为
^“
。如果CMD和FINDSTR都需要转义引号,那么它看起来像
\^“

但是字符串中不再从CMD透视图中引用的任何特殊字符也必须使用
^
进行转义

这里有一个可以逃避所有特殊角色的解决方案。它看起来很糟糕,而且非常混乱

for /f "delims=" %%A in ('findstr /n /c:^"^<con:testSuite^ name^=\^"lp_^" %input%') do (

使用批处理解析XML非常痛苦。批处理一开始就不是一个好的文本处理器。但是,经过一定的努力,您通常可以从给定的XML文件中提取所需的数据。但是,输入文件可以很容易地重新排列为等效的有效XML格式,这将破坏您的解析器

有了这个免责声明

这是一个本机批处理解决方案

@echo off
setlocal disableDelayedExpansion
set input="test.xml"
set output="names.txt"

if exist %output% del %output%
for /f "delims=" %%A in ('findstr /n /c:"<con:testSuite name=" %input%') do (
  set "ln=%%A"
  setlocal enableDelayedExpansion
  call :parseLine
  endlocal
)
type %output%
exit /b

:parseLine
set "ln2=!ln:*<con:testSuite name=!"
if "!ln2!"=="!ln!" exit /b
for /f tokens^=2^ delims^=^" %%B in ("!ln2!") do (
  setlocal disableDelayedExpansion
  >>%output% echo(%%B
  endlocal
)
set "ln=!ln2!"
goto :parseLine
FINDSTR正在使用正则表达式元字符
^
来指定字符串必须以
lp
开头。此时引号已被删除,因此我们不必担心它们

但是,将来可能会遇到这样的情况,即必须在搜索字符串中包含
”。另外,在初始FINDSTR中包含
lp\uu
屏幕可能会稍微快一些,这样就不会不必要地调用
:parseLine

FINDSTR要求用反斜杠转义搜索字符串双引号。但是Windows CMD处理器也有自己的转义规则。像
这样的特殊字符需要被引用或转义。原始代码使用引号,但您希望在字符串中包含引号,这会在命令中创建不平衡的引号。Windows批处理通常喜欢成对引用。CMD必须至少有一个引号转义为
^“
。如果CMD和FINDSTR都需要转义引号,则看起来像
\^”

但是字符串中不再从CMD透视图中引用的任何特殊字符也必须使用
^
进行转义

这里有一个解决方案可以转义所有特殊字符。这看起来很糟糕,很令人困惑

for /f "delims=" %%A in ('findstr /n /c:^"^<con:testSuite^ name^=\^"lp_^" %input%') do (

非常感谢。我试过了,似乎很管用。我怎样才能得到那些以某种模式开头的名字呢?例如,我只需要以lp_开头的测试的名称(例如lp_test1、lp_test2等)。我尝试在findstr命令中包含“lp_uuu”部分,但我不确定如何避开双引号。这不起作用`findstr/n/c:@AndresDelaBarra-请参阅我的更新答案。如果答案符合您的需要,不要忘记接受答案(单击复选标记)。它让其他人知道问题已经得到了回答,如果你接受了答案,它会给你2分,如果你提供了答案,它会给你15分。谢谢。我试过了,似乎很管用。我怎样才能得到那些以某种模式开头的名字呢?例如,我只需要以lp_开头的测试的名称(例如lp_test1、lp_test2等)。我尝试在findstr命令中包含“lp_uuu”部分,但我不确定如何避开双引号。这不起作用`findstr/n/c:@AndresDelaBarra-请参阅我的更新答案。如果答案符合您的需要,不要忘记接受答案(单击复选标记)。它让其他人知道问题已经得到了回答,接受回答会给你2分,提供答案的人会给你15分。你的问题不使用正则表达式,因此我更改了问题标题以更好地匹配你的请求。你的问题不使用正则表达式,因此,我更改了问题标题,以便更好地满足您的要求。
for /f "delims=" %%A in ('findstr /n /c:^"^<con:testSuite^ name^=\^"lp_^" %input%') do (
for /f "delims=" %%A in ('findstr /n /c:"<con:testSuite name=\"lp_^" %input%') do (
for /f "delims=" %%A in ('findstr /nr /c:"<con:testSuite name=[\"\"]lp_" %input%') do (