批量从XML获取特定节点标签值

问题描述 投票:0回答:1

我有一个像这样的 XML 文件:

<config>
    <intensity>0</intensity>
    <variables>
        <variable>
            <name>TONE</name>
            <value>3</value>
            <type>UNSIGNED8</type>
        </variable>
        <variable>
            <name>V_SIC</name>
            <value>0</value>
            <type>UNSIGNED8</type>
        </variable>
        <variable>
            <name>H_YPE</name>
            <value>9000</value>
            <type>INTEGER16</type>
        </variable>
        <variable>
            <name>NUM_SIC</name>
            <value>0</value>
            <type>UNSIGNED8</type>
        </variable>
    </variables>
</config>

我正在尝试将名称为

H_YPE
的节点中的值文本获取到变量中,因此在本例中,变量应该具有
9000
。如果节点
H_YPE
不在 XML 上,只需存储 1。

我看到了这个答案并尝试了

Magoo
实现的内容,虽然我可以看到正在解析这些值,但我感兴趣的是仅获取一个值并将其存储在变量中以供以后使用。

显然我对批处理脚本不太了解,因此我们将不胜感激,提前致谢。

xml batch-file
1个回答
1
投票

由 Windows 命令处理器处理的批处理文件

cmd.exe
是处理 XML 文件的最差选择,因为没有对真正 XML 处理的内置支持。

如果 XML 文件的结构始终如问题所示,则可以使用以下批处理文件代码。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "Value=1"
if not exist "File.xml" goto ProcessValue
set "NameTagFound="
for /F "tokens=2,3 delims=<>" %%I in ('%SystemRoot%\System32\findstr.exe /R "<name>H_YPE</name> <value>[0123456789]*</value>" "File.xml"') do (
    if "%%I" == "name" (
        if /I "%%J" == "H_YPE" set "NameTagFound=1"
    ) else if defined NameTagFound (
        if "%%I" == "value" (
            if not "%%J" == "" set "Value=%%J"
            goto ProcessValue
        )
    )
)
:ProcessValue
echo Value is: %Value%
endlocal

请注意 XML 文件中数据结构的以下要求:

  1. 开始标签
    <name>
    <value>
    必须留有前导空格/制表符,因为
    tokens=2,3 delims=<>
    ,并且这两个元素必须位于不包含任何其他元素或属性的单独行上。
  2. 具有值
    name
    的元素
    H_YPE
    必须仅存在于元素
    variable
    中,而不能存在于另一个元素中,因为代码不会检查在文件中的位置找到
    <name>H_YPE</name>
  3. 具有值
    name
    的元素
    H_YPE
    必须位于元素
    variable
    内,位于元素
    value
    所在行上方的单独一行上。因此,如果不调整代码,就无法更改元素
    name
    value
    的顺序。
  4. 元素
    variable
    以及元素
    name
    的值为
    H_YPE
    也必须具有元素
    value
    或在
    value
    行下方任何位置找到的下一个元素
    <name>H_YPE</name>
    的值被错误地分配给环境变量
    Value
    而不是使用默认值
    1
  5. H_YPE
    必须始终以这种拼写形式出现在 XML 文件中(所有字母均为大写)。

如果 XML 文件内容并不总是满足五个要求之一,则可以增强代码以执行更多 XML 结构检查。

根据 XML 规范,XML 标签区分大小写。因此,此代码运行时 FINDSTR 也区分大小写,尽管值

H_YPE
可以在任何情况下符合 XML 规范。出于同样的原因,比较字符串的 IF 条件也区分大小写,包括检查值 H_YPE
IF
条件。

要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

  • echo /?
  • endlocal /?
  • findstr /?
  • for /?
  • goto /?
  • if /?
  • set /?
  • setlocal /?
© www.soinside.com 2019 - 2024. All rights reserved.