返回

批处理脚本高效解析 XML 获取标记属性

windows

用批处理解析 XML 以获取标记属性

简介

在批处理脚本中解析 XML 是个常见需求,例如提取特定标记的属性值。本文将介绍如何使用 Windows 批处理脚本有效地执行此操作,重点关注获取标记属性并将其连接成一个字符串。

获取标记

第一步是获取要解析的标记。这可以通过使用字符串替换操作符 (*) 和延迟展开 (EnableDelayedExpansion) 来实现。例如:

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 循环来实现,如下所示:

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
)

提取属性值

最后,提取每个属性值需要一个子例程。该例程可以如下实现:

:GET_ATTR
setlocal DisableDelayedExpansion
set "PAR=%~2"
setlocal EnableDelayedExpansion
set "STR=!%~1!"
set "ALLFILESFUNC=%%~S "
set "NEXT="
:LOOP
if defined NEXT (
    endlocal
    echo the filename - "%%~S"
    set "NEXT="
    set "ALLFILESFUNC=!ALLFILESFUNC! "^%%~S"^ "
    echo Accumulative - %ALLFILESFUNC%
    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 not defined STR goto LOOP
if defined NEXT echo(
endlocal
endlocal
exit /B

结论

本文演示了如何使用 Windows 批处理脚本从 XML 中解析标记属性并将其连接成一个字符串。通过使用字符串替换、延迟展开和子例程,可以轻松地实现此任务,并将其应用于各种自动化任务。

常见问题解答

1. 我需要安装任何特殊软件或库吗?

不,此脚本使用 Windows 批处理脚本的内置功能。

2. 脚本是否适用于所有版本的 Windows?

是的,该脚本与 Windows 的所有版本兼容,从 XP 到 Windows 11。

3.我可以使用该脚本解析复杂的 XML 吗?

是的,该脚本可以处理复杂的 XML 文件。但是,如果 XML 结构非常嵌套或复杂,则可能需要进行修改。

4. 如何使用子例程?

在批处理脚本中,子例程使用 call 命令调用。子例程的名称后跟参数(如果需要)。

5. 有没有替代使用延迟展开的方法?

是的,可以使用传统的字符串操作命令(如 setfindstrfor) 来解析 XML。但是,延迟展开提供了一种更简洁、更有效的方法。