通过批处理从XML中获取特定的节点标记值



我有一个类似于以下的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%System32findstr.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. 由于tokens=2,3 delims=<>,起始标记<name><value>必须留有前导空格/制表符,并且这两个元素必须位于不包含任何其他元素或属性的单独行上
  2. 值为H_YPE的元素name必须仅存在于元素variable内,而不存在于另一个元素内,因为代码不检查文件中<name>H_YPE</name>的位置
  3. 值为H_YPE的元素name必须位于元素variable内部,位于具有元素value的行上方的单独行上。因此,元素CCD_ 17和CCD_ 18的顺序不能在不调整代码的情况下改变
  4. 具有值为H_YPE的元素name的元素variable也必须具有元素value,或者在具有<name>H_YPE</name>的行下方的任何位置找到的下一个元素value的值被错误地分配给环境变量Value,而不是使用默认值1
  5. H_YPE必须始终存在于具有此拼写的XML文件中(所有字母均为大写(

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

根据XML规范,XML标记区分大小写。因此,尽管H_YPE值在任何情况下都可能符合XML规范,但此代码运行的FINDTR也区分大小写。比较字符串的IF条件也区分大小写,原因与此相同,包括检查值H_YPE

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

  • echo /?
  • endlocal /?
  • findstr /?
  • for /?
  • goto /?
  • if /?
  • set /?
  • setlocal /?

最新更新