仅当两个值匹配时才从XML文件提取数据。(使用.bat)
我正在寻找一个.bat脚本,它通过我的XML文件运行,并且只提取指定XML文件的某些数据。只有在名称“Ian”和职位“executive”匹配的情况下,才应提取这些XML文件的数据。如果.bat找到一个匹配的XML文件,它应该只提取3个指定的值 例如: 仅在以下情况下提取:仅当两个值匹配时才从XML文件提取数据。(使用.bat),xml,batch-file,Xml,Batch File,我正在寻找一个.bat脚本,它通过我的XML文件运行,并且只提取指定XML文件的某些数据。只有在名称“Ian”和职位“executive”匹配的情况下,才应提取这些XML文件的数据。如果.bat找到一个匹配的XML文件,它应该只提取3个指定的值 例如: 仅在以下情况下提取: 值应为“Name=Ian” 值应为“职位=高管” 如果这些值匹配,则应提取以下数据: 1.当前工作 2.shortID 3.度假柜台 我希望工作不要太多。XML数据都是相似的 <Name="Ian" workstamp
<Name="Ian" workstampIN="2017-04-06" worknumber="XXXX" editor="XXXX" Position="Executive" currentWork="engineer" shortID="543532" holidaycounter="50" >
等等
对不起,我对蝙蝠真的很陌生。提前谢谢你的帮助 考虑:
batch
对于解析XML文件来说是一个错误的选择。也就是说:使用适当的标记和分隔符,使用for
循环提取数据:
@echo off
setlocal
for %%z in (*.xml) do call :extract %%z
goto :eof
:extract
for /f "tokens=1-8 delims=<> " %%a in (%*) do (
set _%%a
set _%%e
set _%%f
set _%%g
set _%%h
)
REM set _
if %_Position%=="Executive" if %_Name%=="Ian" (
echo 1. %_currentWork%
echo 2. %_shortID%
echo 3. %_holidaycounter%
) >> outputfile.txt
goto :eof
@echo关闭
setlocal
对于(*.xml)中的%%z,请调用:提取%%z
后藤:eof
:摘录
对于/f“tokens=1-8 delims=“%%a in(%*)do(
设置%%a
设置%%e
设置%%f
设置%%g
设置uh%%h
)
REM集合_
如果%\u职位%=“高管”如果%\u姓名%=“伊恩”(
回波1.%\u当前工作百分比
回声2.%\u短ID%
echo 3.%\u holidaycounter%
)>>outputfile.txt
后藤:eof
请考虑:批处理
是解析XML文件的错误选择。也就是说:使用适当的标记和分隔符,使用for
循环提取数据:
@echo off
setlocal
for %%z in (*.xml) do call :extract %%z
goto :eof
:extract
for /f "tokens=1-8 delims=<> " %%a in (%*) do (
set _%%a
set _%%e
set _%%f
set _%%g
set _%%h
)
REM set _
if %_Position%=="Executive" if %_Name%=="Ian" (
echo 1. %_currentWork%
echo 2. %_shortID%
echo 3. %_holidaycounter%
) >> outputfile.txt
goto :eof
@echo关闭
setlocal
对于(*.xml)中的%%z,请调用:提取%%z
后藤:eof
:摘录
对于/f“tokens=1-8 delims=“%%a in(%*)do(
设置%%a
设置%%e
设置%%f
设置%%g
设置uh%%h
)
REM集合_
如果%\u职位%=“高管”如果%\u姓名%=“伊恩”(
回波1.%\u当前工作百分比
回声2.%\u短ID%
echo 3.%\u holidaycounter%
)>>outputfile.txt
后藤:eof
@ECHO OFF
SETLOCAL enabledelayedexpansion
设置“sourcedir=U:\sourcedir”
设置“filename1=%sourcedir%\q4314990.txt”
设置/a过滤器计数=0
设置/a字段计数=0
呼叫:filterset%*
如果%filtercount%==0转到语法
如果%fieldcount%==0转到语法
对于/f“usebackqdelims=“%%a IN”(“%filename1%”)DO(
设置“行=%%a”
设置“行=!行:=!”
设置“行=!行::=!”
呼叫:过滤器!线路!
)
后藤:EOF
:语法
回显语法为[requiredname requiredvalue]*::reportfieldname*
后藤:EOF
::设置和计数筛选器和字段
:过滤器集
如果“%~1”==”:“转到字段集
如果“%~1”==”转到:EOF
设置/a过滤器计数+=1
设置“$%filtercount%=%~1”
转移
设置“#%filtercount%=%~1”
转移
GOTO过滤器集
:字段集
转移
如果“%~1”==”转到:EOF
设置/a字段计数+=1
设置“\u%fieldcount%=%~1”
后藤场集
:过滤器
对于(1,1,%fieldcount%)中的/L%%z,请设置“@%%z=”
SET/a matchesfound=0
:filterloop
如果“%~1”==”转到报告
对于(1,1,%filtercount%)中的/L%%z,如果/i“%~1>%~2”==”!$%z!>!#%%z!”设置/a matchesfound+=1,则执行此操作
对于(1,1,%fieldcount%)中的/L%%z,如果/i“%$1”==”!\uz%%设置“@%%z=%2”,则执行该操作
移位
转移
转到过滤器环路
:报告
如果%matchesfound%neq%filtercount%GOTO:EOF
设置“reportline=”
对于(1,1,%fieldcount%)中的/L%%z,请设置“reportline=!reportline!!@%%z!”!
回显(%reportline:~1%
后藤:eof
您需要更改sourcedir
的设置以适应您的环境
我使用了一个名为q43314990.txt
的文件,其中包含了您的数据和一些用于测试的虚拟数据
这个过程应该能解决你的问题
我假设调用此命令的批处理命令是
此批次cls和q43314990名称ian position executive::currentWork shortid holidaycounter
即(fieldname requiredvalue)根据需要重复多次“::”(reportfiledname)根据需要重复多次
而这一案例并不相关
第一个操作是通过call
ing:filterset
分析命令行。如果未同时指定筛选器和报告字段,则显示所需的语法
否则,将每个文件行读到%%a
,然后再读到行
。处理行
以删除
和
(一个先前删除的字符,因此不存在,因此可用于分隔字段)连接起来,并与由$1>#1...?>#构造的相同字符串进行比较。在匹配上,计算匹配数
然后查看%1
中的文件名是否与
中的每个所需输出文件名匹配,如果匹配,则将该参数的值从%2
记录到@
然后按住shift键两次以删除名称/值对,然后继续下一个
当没有剩下参数时,仅当找到的匹配数与筛选器数相同时才报告。在这种情况下,只需通过在空格后串联每个选定字段的值来构建报告行。最终报告是echo
跳过第一个字符(将是空格)@echo OFF
SETLOCAL enabledelayedexpansion
设置“sourcedir=U:\sourcedir”
设置“filename1=%sourcedir%\q4314990.txt”
设置/a过滤器计数=0
设置/a字段计数=0
C
call xpath.bat name.xml "//N[@Name='Ian'][@Position='Executive']/@shortID"
@echo off
setlocal EnableDelayedExpansion
(for /F "tokens=1,2 delims=:<>" %%a in ('findstr "Name=\"Ian\" Position=\"Executive\"" *.xml') do (
set "list=%%b"
for /F "delims=" %%c in (^"!list: ^=^
% Do NOT remove this line %
!^") do set %%c
if "!Name!+!Position!" equ ""Ian"+"Executive"" (
echo File: "%%a", currentWork=!currentWork!, shortID=!shortID!, holidaycounter=!holidaycounter!
)
)) > Outputfile.txt