我有一个像这样的 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
实现的内容,虽然我可以看到正在解析这些值,但我感兴趣的是仅获取一个值并将其存储在变量中以供以后使用。
显然我对批处理脚本不太了解,因此我们将不胜感激,提前致谢。
由 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 文件中数据结构的以下要求:
<name>
和<value>
必须留有前导空格/制表符,因为tokens=2,3 delims=<>
,并且这两个元素必须位于不包含任何其他元素或属性的单独行上。name
的元素 H_YPE
必须仅存在于元素 variable
中,而不能存在于另一个元素中,因为代码不会检查在文件中的位置找到 <name>H_YPE</name>
。name
的元素 H_YPE
必须位于元素 variable
内,位于元素 value
所在行上方的单独一行上。因此,如果不调整代码,就无法更改元素 name
和 value
的顺序。variable
以及元素 name
的值为 H_YPE
也必须具有元素 value
或在 value
行下方任何位置找到的下一个元素 <name>H_YPE</name>
的值被错误地分配给环境变量Value
而不是使用默认值 1
。H_YPE
必须始终以这种拼写形式出现在 XML 文件中(所有字母均为大写)。如果 XML 文件内容并不总是满足五个要求之一,则可以增强代码以执行更多 XML 结构检查。
根据 XML 规范,XML 标签区分大小写。因此,此代码运行时 FINDSTR 也区分大小写,尽管值
H_YPE
可以在任何情况下符合 XML 规范。出于同样的原因,比较字符串的 IF 条件也区分大小写,包括检查值 H_YPE
的 IF条件。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
echo /?
endlocal /?
findstr /?
for /?
goto /?
if /?
set /?
setlocal /?