使用批处理文件在xml标记之间复制文本

时间:2017-01-24 14:01:23

标签: 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 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.请指导

3 个答案:

答案 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 ,或其他任何内容都会更好。