我正在尝试创建一个批处理文件,该文件将读取两个不同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 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>
......等等。
我想在标记<PlateName></PlateName>
和<Waste></Waste>
之间提取信息。
如果除了批量编程之外还有其他方式,请指导。此外,我试图读取特定文件夹中的大量XML文件,但它们都有相同的标签。
以下代码从标记PlateName
但不是Waste
:
@echo OFF
del output.txt
for /f "delims=" %%i in ('findstr /i /c:"<PlateName>" *.xml') do call :job1 "%%i"
for /f "delims=" %%i in ('findstr /i :"<Waste>" *.xml') do call :job2 "%%i"
goto :eof
:job1
set line=%1
set line=%line:/=%
set line=%line:<=+%
set line=%line:>=+%
set line=%line:*+PlateName+=%
set line=%line:+=&rem.%
echo.%line%>>output.txt
:job2
set line2=%1
set line2=%line2:/=%
set line2=%line2:<=+%
set line2=%line2:>=+%
set line2=%line2:*+Waste+=%
set line2=%line2:+=&rem.%
echo.%line2%>>output.txt
:eof
它输出为:
DECx125_20115
"17Jan_125thou_DEC_B_FullSheet.xml:&rem.PlateName&rem.DECx125_20115&rem.PlateName&rem."
除此之外,如何编辑代码以只读取标签之间值的前几个字符?例如:在313719_V4_DSpotOrange(2017年3月30日16:50:17)我只想阅读313719.请指导
答案 0 :(得分:2)
你的xml最后应该有一个</JobInformation>
标签。
您实际上可以解析xml以使用xpath获取数据。请尝试以下脚本:
@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
答案 1 :(得分:0)
如果它总是以相同的方式格式化,您可以通过以下更简单的方式完成:
@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
)
然而,作为@RB。他说,使用具有适当XML解析功能的东西会更好。 Powershell是一个选项,VBscript是另一个选择。
答案 2 :(得分:0)
在单个findstr
命令中使用正则表达式:
for /F "tokens=2,3 delims=<>" %%a in ('findstr "<PlateName>.*</PlateName> <Waste .*>.*</Waste>" *.txt') do (
echo Found: %%a : %%b
)
输出:
Found: PlateName : DECx125_20115
Found: Waste unit='sqm' : 0.285
另外,你写道:
如果除了批量编程之外还有其他方式,请指导。
从字面上看,任何其他方式都可以做得更好。 批处理文件在准确解析XML时是最糟糕的。
C ++ , C#, Java , Python ,或其他任何内容都会更好。