Batch file 使用批处理文件在xml标记之间复制文本
我正在尝试创建一个批处理文件,该文件将读取两个不同XML标记之间的文本,并将值写入文本文件 XML看起来像:Batch file 使用批处理文件在xml标记之间复制文本,batch-file,Batch File,我正在尝试创建一个批处理文件,该文件将读取两个不同XML标记之间的文本,并将值写入文本文件 XML看起来像: <JobInformation> <JOB> <JobName>17Jan_125thou_DEC_B_FullSheet</JobName> <Date>17 Jan 2017 11:24:34</Date> <CDI>192.168.0.29</CDI> <Circumference
<JobInformation>
<JOB>
<JobName>17Jan_125thou_DEC_B_FullSheet</JobName>
<Date>17 Jan 2017 11:24:34</Date>
<CDI>192.168.0.29</CDI>
<Circumference unit='mm'>1289.94mm</Circumference>
<Laser-Energy unit='J/sqcm'>3.2</Laser-Energy>
<XL-Workflow>XL125_45</XL-Workflow>
<Knife-Type>45 Degree</Knife-Type>
<PREVIEW- IMAGE>"./images/17Jan_125thou_DEC_B_FullSheet/17Jan_125thou_DEC_B_FullSheet.jpg< /PREVIEW-IMAGE>
</JOB>
<Plate>
<PlateName>DECx125_20115</PlateName>
<Type>PLATE</Type>
<PlateWidth unit='mm'>2032.0</PlateWidth>
<PlateHeight unit='mm'>1254.94</PlateHeight>
<TotalSize unit='sqm'>2.55</TotalSize>
<Waste unit='sqm'>0.285</Waste>
</Plate>
其输出为:
DECx125_20115
"17Jan_125thou_DEC_B_FullSheet.xml:&rem.PlateName&rem.DECx125_20115&rem.PlateName&rem."
更进一步,我如何编辑代码以只读取标记之间值的前几个字符?例如:在313719中(2017年3月30日16:50:17),我只想读313719。请参考如果它总是以相同的方式格式化,您可以按以下更简单的方式进行:
@echo OFF
del output.txt
for /f "delims=<> tokens=3" %%i in ('findstr /i /c:"<PlateName>" *.xml') do (
echo %%i>>output.txt
)
for /f "delims=<> tokens=3" %%i in ('findstr /i /c:"<Waste" *.xml') do (
echo %%i>>output.txt
)
@echo关闭
del output.txt
对于('findstr/i/c:'*.xml')中的/f“delims=tokens=3”%%i(
echo%%i>>output.txt
)
对于/f“delims=tokens=3”%%i in('findstr/i/c:如果它总是以相同的方式格式化,您可以用一种简单得多的方式进行格式化,如下所示:
@echo OFF
del output.txt
for /f "delims=<> tokens=3" %%i in ('findstr /i /c:"<PlateName>" *.xml') do (
echo %%i>>output.txt
)
for /f "delims=<> tokens=3" %%i in ('findstr /i /c:"<Waste" *.xml') do (
echo %%i>>output.txt
)
@echo关闭
del output.txt
对于('findstr/i/c:'*.xml')中的/f“delims=tokens=3”%%i(
echo%%i>>output.txt
)
对于/f“delims=tokens=3”%%i in('findstr/i/c:“您的xml应该在末尾多加一个
标记。
实际上,您可以使用xpath解析xml以获取数据。请尝试以下脚本:
@if (@X)==(@Y) @end /* JScript comment
@echo off
cscript //E:JScript //nologo "%~f0" %*
exit /b %errorlevel%
@if (@X)==(@Y) @end JScript comment */
var objDoc = WScript.CreateObject("MSXML.DOMDocument");
objDoc.load(WScript.Arguments.Item(0));
var objNode = objDoc.selectSingleNode("//"+WScript.Arguments.Item(1));
WScript.Echo(objNode.text);
你可以像这样使用它:
call getXMLText.bat "xml.xml" Waste
call getXMLText.bat "xml.xml" PlateName
您的xml应该在末尾多加一个
标记。
实际上,您可以使用xpath解析xml以获取数据。请尝试以下脚本:
@if (@X)==(@Y) @end /* JScript comment
@echo off
cscript //E:JScript //nologo "%~f0" %*
exit /b %errorlevel%
@if (@X)==(@Y) @end JScript comment */
var objDoc = WScript.CreateObject("MSXML.DOMDocument");
objDoc.load(WScript.Arguments.Item(0));
var objNode = objDoc.selectSingleNode("//"+WScript.Arguments.Item(1));
WScript.Echo(objNode.text);
你可以像这样使用它:
call getXMLText.bat "xml.xml" Waste
call getXMLText.bat "xml.xml" PlateName
在单个findstr
命令中使用正则表达式:
for /F "tokens=2,3 delims=<>" %%a in ('findstr "<PlateName>.*</PlateName> <Waste .*>.*</Waste>" *.txt') do (
echo Found: %%a : %%b
)
你还写道:
此外,如果有任何其他方式比批量编程,请指导
从字面上说,还有其他更好的方法。
批处理文件在准确解析XML方面绝对是最差的
C++、C#、Java、Python,或者其他任何更好的方法。在单个findstr
命令中使用正则表达式:
for /F "tokens=2,3 delims=<>" %%a in ('findstr "<PlateName>.*</PlateName> <Waste .*>.*</Waste>" *.txt') do (
echo Found: %%a : %%b
)
你还写道:
此外,如果有任何其他方式比批量编程,请指导
从字面上说,还有其他更好的方法。
批处理文件在准确解析XML方面绝对是最差的
C++、C#、Java、Python,或者其他更好的东西。PowerShell内置了强大的XML解析功能-我强烈建议您使用它。在Google上的PowerShell中有很多关于解析XML的帖子。在第二个findstr
命令l中有一个输入错误行:findstr/i/c:“
--缺少/c
选项。请在:job2
和上一行之间插入goto:eof
。您的代码正在搜索XML文件中未出现的文本字符串
;只有一部分
。@sharvillaval,您不会在注释中添加代码更新。编辑您的问题和rem请参阅您的评论。现在输出为DECx125_20115“17Jan_125000; u DEC_B_FullSheet.xml:&rem.Waste unit='sqm'&rem.0.285&rem.Waste&rem。”Vbscript、Jscript和Powershell都具有读取XML文件的本机功能。Powershell内置了强大的XML解析功能-我强烈建议您使用它。Google上有很多关于Powershell解析XML的帖子。第二个findstr
命令行中有一个打字错误:findstr/I/c:“
--缺少/c
选项。请在:job2
和上一行之间插入goto:eof
。您的代码正在搜索XML文件中未出现的文本字符串
;只有一部分
。@sharvillaval,您不会在注释中添加代码更新。编辑您的问题和rem查看您的评论。现在输出为DECx125_20115“17Jan_125000; u DEC_B_FullSheet.xml:&rem.Waste unit='sqm'&rem.0.285&rem.Waste&rem.“Vbscript、Jscript和Powershell都具有读取xml文件的本机功能。您只需要一行。for/f“delims=tokens=3”%G in('findstr/i/c:/c:“进一步说,我如何编辑代码以只读取标记之间值的前几个字符?例如:在313719中(2017年3月30日16:50:17),我只想读取313719。请指导您只需要一行。对于/f“delims=tokens=3”%%G in('findstr/I/c:”“/c:“进一步说,我如何编辑代码以仅读取标记之间值的前几个字符?例如:在313719_V4_DSpotOrange(2017年3月30日16:50:17)中,我只想读取313719。请指导