要解析的 Bat 文件 XML
Bat File to Parse XML
如果我有 xml 以下格式的文件,我该如何在批处理 (.bat) 脚本中解析它?或者有什么方法可以不解析就只得到某个值吗?
例如,我需要从这个 xml 文件中获取 'date' 的值。
<?xml version="1.0" encoding="UTF-8"?>
<note>
<slideshow
title="Sample Slide Show"
date="2016/05/03"
author="Yours Truly" >
</slideshow>
</note>
这是一个接受单个参数的脚本 - xml 文件并获取幻灯片的节点日期属性值。如果文件具有不同的结构,您可以更改 xpath 查询以满足您的需要:
@if (@X)==(@Y) @end /* JScript comment
@echo off
rem :: the first argument is the script name as it will be used for proper help message
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("//slideshow");
WScript.Echo(objNode.getAttribute("date"));
编辑
现在有一个 xpath.bat - 一个可以解析 xml 文件的常用脚本。
这是一个纯粹的 batch-file 解决方案。以下脚本需要三个命令行参数:XML 文件的(路径)、节点(在您的示例中为 slideshow
)和属性名称(date
),顺序为给定顺序. return 数据输出到控制台 window 并且可以重定向到文件 (>
).
这是 运行 脚本的示例命令行(假设 XML 文件被称为 presentation.xml
,脚本被命名为 extract-xml-attrib.bat
,结果数据是将写入 attr.txt
):
"extract-xml-attrib.bat" "presentation.xml" "slideshow" "date" > "attr.txt"
这是脚本的代码extract-xml-attrib.bat
:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "XML=%~1"
set "TAG=%~2"
set "PAR=%~3"
rem // Define defaults here:
if not defined XML set "XML=presentation.xml"
if not defined TAG set "TAG=slideshow"
if not defined PAR set "PAR=date"
set "FLAG="
for /F usebackq^ delims^=^ eol^= %%L in ("%XML%") do (
set "LINE=%%L"
setlocal EnableDelayedExpansion
set "REST=!LINE:*<%TAG%=!"
if not defined REST (
set "FLAG=#"
) else (
set "REST=!LINE:*<%TAG% =!"
if not "!REST!"=="!LINE!" (
set "FLAG=#"
) else (
set "REST=!LINE:*<%TAG% =!"
if not "!REST!"=="!LINE!" (
set "FLAG=#"
)
)
)
for /F "tokens=1,2 delims=>" %%E in ("!REST!/") do (
if defined FLAG (
endlocal
set "FLAG=#"
) else (
endlocal
)
set "REST=%%E"
if defined FLAG (
call :GET_ATTR "REST:~,-1" "%PAR%"
)
if not "%%F"=="" (
set "FLAG="
)
setlocal EnableDelayedExpansion
)
endlocal
)
endlocal
exit /B
:GET_ATTR var_string param_name
setlocal DisableDelayedExpansion
set "PAR=%~2"
setlocal EnableDelayedExpansion
set "STR=!%~1!"
set "NEXT="
for %%S in (!STR!) do (
if defined NEXT (
endlocal
echo(%%~S
set "NEXT="
setlocal EnableDelayedExpansion
)
set "STR=!STR:*%%S=!"
if "%%S"=="%PAR%" (
if defined STR (
if "!STR:~,1!"=="=" (
if "!STR:~1,1!"==" " (
echo(
) else if "!STR:~1,1!"==" " (
echo(
) else (
set "NEXT=#"
)
)
)
)
)
if defined NEXT echo(
endlocal
endlocal
exit /B
如果我有 xml 以下格式的文件,我该如何在批处理 (.bat) 脚本中解析它?或者有什么方法可以不解析就只得到某个值吗?
例如,我需要从这个 xml 文件中获取 'date' 的值。
<?xml version="1.0" encoding="UTF-8"?>
<note>
<slideshow
title="Sample Slide Show"
date="2016/05/03"
author="Yours Truly" >
</slideshow>
</note>
这是一个接受单个参数的脚本 - xml 文件并获取幻灯片的节点日期属性值。如果文件具有不同的结构,您可以更改 xpath 查询以满足您的需要:
@if (@X)==(@Y) @end /* JScript comment
@echo off
rem :: the first argument is the script name as it will be used for proper help message
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("//slideshow");
WScript.Echo(objNode.getAttribute("date"));
编辑 现在有一个 xpath.bat - 一个可以解析 xml 文件的常用脚本。
这是一个纯粹的 batch-file 解决方案。以下脚本需要三个命令行参数:XML 文件的(路径)、节点(在您的示例中为 slideshow
)和属性名称(date
),顺序为给定顺序. return 数据输出到控制台 window 并且可以重定向到文件 (>
).
这是 运行 脚本的示例命令行(假设 XML 文件被称为 presentation.xml
,脚本被命名为 extract-xml-attrib.bat
,结果数据是将写入 attr.txt
):
"extract-xml-attrib.bat" "presentation.xml" "slideshow" "date" > "attr.txt"
这是脚本的代码extract-xml-attrib.bat
:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "XML=%~1"
set "TAG=%~2"
set "PAR=%~3"
rem // Define defaults here:
if not defined XML set "XML=presentation.xml"
if not defined TAG set "TAG=slideshow"
if not defined PAR set "PAR=date"
set "FLAG="
for /F usebackq^ delims^=^ eol^= %%L in ("%XML%") do (
set "LINE=%%L"
setlocal EnableDelayedExpansion
set "REST=!LINE:*<%TAG%=!"
if not defined REST (
set "FLAG=#"
) else (
set "REST=!LINE:*<%TAG% =!"
if not "!REST!"=="!LINE!" (
set "FLAG=#"
) else (
set "REST=!LINE:*<%TAG% =!"
if not "!REST!"=="!LINE!" (
set "FLAG=#"
)
)
)
for /F "tokens=1,2 delims=>" %%E in ("!REST!/") do (
if defined FLAG (
endlocal
set "FLAG=#"
) else (
endlocal
)
set "REST=%%E"
if defined FLAG (
call :GET_ATTR "REST:~,-1" "%PAR%"
)
if not "%%F"=="" (
set "FLAG="
)
setlocal EnableDelayedExpansion
)
endlocal
)
endlocal
exit /B
:GET_ATTR var_string param_name
setlocal DisableDelayedExpansion
set "PAR=%~2"
setlocal EnableDelayedExpansion
set "STR=!%~1!"
set "NEXT="
for %%S in (!STR!) do (
if defined NEXT (
endlocal
echo(%%~S
set "NEXT="
setlocal EnableDelayedExpansion
)
set "STR=!STR:*%%S=!"
if "%%S"=="%PAR%" (
if defined STR (
if "!STR:~,1!"=="=" (
if "!STR:~1,1!"==" " (
echo(
) else if "!STR:~1,1!"==" " (
echo(
) else (
set "NEXT=#"
)
)
)
)
)
if defined NEXT echo(
endlocal
endlocal
exit /B