首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Bat文件解析XML

Bat文件解析XML
EN

Stack Overflow用户
提问于 2016-05-04 05:18:19
回答 2查看 2.2K关注 0票数 1

如果我有以下格式的xml文件,如何在批处理(.bat)脚本中解析它?还是有一种方法,我只能得到一定的价值,而不解析它?

例如,我需要从这个xml文件中获取'date‘的值。

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<note>
<slideshow 
    title="Sample Slide Show"
    date="2016/05/03"
    author="Yours Truly"  >

</slideshow>
</note>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-05 00:03:10

这里是一个纯批文件解决方案。以下脚本需要三个命令行参数:(路径到) XML文件、节点(在您的示例中是slideshow)和属性名称(date),按给定的顺序。返回数据被输出到控制台窗口,可以重定向到文件(>)中。

这是一个运行脚本的示例命令行(假设XML文件名为presentation.xml,脚本名为extract-xml-attrib.bat,生成的数据将写入attr.txt):

代码语言:javascript
运行
复制
"extract-xml-attrib.bat" "presentation.xml" "slideshow" "date" > "attr.txt"

这是脚本extract-xml-attrib.bat的代码

代码语言:javascript
运行
复制
@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
票数 1
EN

Stack Overflow用户

发布于 2016-05-04 10:08:15

这里有一个脚本,它接受一个参数-- xml文件,并获取幻灯片显示的节点日期属性值。如果文件具有不同的结构,则可以修改xpath查询以满足您的需要:

代码语言:javascript
运行
复制
@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文件的通用脚本。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37019038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档