如何使用批处理文件从XML文件中提取信息?
这是我正在尝试的代码:
@echo off
setlocal enableextensions enabledelayedexpansion
set "xmlFile=%~1"
for /f "tokens=*" %%A in (%xmlFile%) do (
call :f_extractData "%%A"
)
:f_extractData
set line=%1
if not x%line:00-24=%==x%line% (
if not x%line:precipitacion=%==x%line% (
set data=%1:"=%
echo.%data%
)
)
EXIT /b
endlocal
:EOF
但在阅读以下内容时失败了:
<prob_precipitacion periodo="00-24"></prob_precipitacion>
<prob_precipitacion periodo="00-24">0</prob_precipitacion>
<prob_precipitacion periodo="00-24">25</prob_precipitacion>
第一行的结果值应为0,第二行的结果值应为0,第三行的结果值应为25。但我尝试使用
提取部分字符串set data="%data:~37,-22%"
在这些方面失败了。我猜它因>
和"
字符而失败。但我不知道如何删除这些角色来管理。
有什么想法吗?
以下是我用来测试的完整xml:
<?xml version="1.0" encoding="ISO-8859-15" ?>
<root id="41091" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.aemet.es/xsd/localidades.xsd">
<origen>
<productor>Agencia Estatal de Meteorología - AEMET. Gobierno de España</productor>
<web>http://www.aemet.es</web>
<enlace>http://www.aemet.es/es/eltiempo/prediccion/municipios/sevilla-id41091</enlace>
<language>es</language>
<copyright>© AEMET. Autorizado el uso de la información y su reproducción citando a AEMET como autora de la misma.</copyright>
<nota_legal>http://www.aemet.es/es/nota_legal</nota_legal>
</origen>
<elaborado>2014-12-17T20:20:02</elaborado>
<nombre>Sevilla</nombre>
<provincia>Sevilla</provincia>
<prediccion>
<dia fecha="2014-12-17">
<prob_precipitacion periodo="00-24"></prob_precipitacion>
<prob_precipitacion periodo="00-12"></prob_precipitacion>
<prob_precipitacion periodo="12-24">0</prob_precipitacion>
<prob_precipitacion periodo="00-06"></prob_precipitacion>
<prob_precipitacion periodo="06-12"></prob_precipitacion>
<prob_precipitacion periodo="12-18">0</prob_precipitacion>
<prob_precipitacion periodo="18-24">0</prob_precipitacion>
<cota_nieve_prov periodo="00-24"></cota_nieve_prov>
<cota_nieve_prov periodo="00-12"></cota_nieve_prov>
<cota_nieve_prov periodo="12-24"></cota_nieve_prov>
<cota_nieve_prov periodo="00-06"></cota_nieve_prov>
<cota_nieve_prov periodo="06-12"></cota_nieve_prov>
<cota_nieve_prov periodo="12-18"></cota_nieve_prov>
<cota_nieve_prov periodo="18-24"></cota_nieve_prov>
<estado_cielo periodo="00-24" descripcion=""></estado_cielo>
<estado_cielo periodo="00-12" descripcion=""></estado_cielo>
<estado_cielo periodo="12-24" descripcion="Despejado">11</estado_cielo>
<estado_cielo periodo="00-06" descripcion=""></estado_cielo>
<estado_cielo periodo="06-12" descripcion=""></estado_cielo>
<estado_cielo periodo="12-18" descripcion="Despejado">11</estado_cielo>
<estado_cielo periodo="18-24" descripcion="Despejado">11n</estado_cielo>
<viento periodo="00-24">
<direccion></direccion>
<velocidad></velocidad>
</viento>
<viento periodo="00-12">
<direccion></direccion>
<velocidad></velocidad>
</viento>
<viento periodo="12-24">
<direccion>C</direccion>
<velocidad>0</velocidad>
</viento>
<viento periodo="00-06">
<direccion></direccion>
<velocidad></velocidad>
</viento>
<viento periodo="06-12">
<direccion>C</direccion>
<velocidad>0</velocidad>
</viento>
<viento periodo="12-18">
<direccion>C</direccion>
<velocidad>0</velocidad>
</viento>
<viento periodo="18-24">
<direccion>C</direccion>
<velocidad>0</velocidad>
</viento>
<racha_max periodo="00-24"></racha_max>
<racha_max periodo="00-12"></racha_max>
<racha_max periodo="12-24"></racha_max>
<racha_max periodo="00-06"></racha_max>
<racha_max periodo="06-12"></racha_max>
<racha_max periodo="12-18"></racha_max>
<racha_max periodo="18-24"></racha_max>
<temperatura>
<maxima>15</maxima>
<minima>9</minima>
<dato hora="06"></dato>
<dato hora="12">15</dato>
<dato hora="18">14</dato>
<dato hora="24">9</dato>
</temperatura>
<sens_termica>
<maxima>15</maxima>
<minima>8</minima>
<dato hora="06"></dato>
<dato hora="12">15</dato>
<dato hora="18">14</dato>
<dato hora="24">9</dato>
</sens_termica>
<humedad_relativa>
<maxima>95</maxima>
<minima>60</minima>
<dato hora="06"></dato>
<dato hora="12">60</dato>
<dato hora="18">65</dato>
<dato hora="24">90</dato>
</humedad_relativa>
<uv_max>2</uv_max>
</dia>
<dia fecha="2014-12-18">
<prob_precipitacion periodo="00-24">25</prob_precipitacion>
<prob_precipitacion periodo="00-12">0</prob_precipitacion>
<prob_precipitacion periodo="12-24">0</prob_precipitacion>
<prob_precipitacion periodo="00-06">0</prob_precipitacion>
<prob_precipitacion periodo="06-12">0</prob_precipitacion>
<prob_precipitacion periodo="12-18">0</prob_precipitacion>
<prob_precipitacion periodo="18-24">0</prob_precipitacion>
<cota_nieve_prov periodo="00-24"></cota_nieve_prov>
<cota_nieve_prov periodo="00-12"></cota_nieve_prov>
<cota_nieve_prov periodo="12-24"></cota_nieve_prov>
<cota_nieve_prov periodo="00-06"></cota_nieve_prov>
<cota_nieve_prov periodo="06-12"></cota_nieve_prov>
<cota_nieve_prov periodo="12-18"></cota_nieve_prov>
<cota_nieve_prov periodo="18-24"></cota_nieve_prov>
<estado_cielo periodo="00-24" descripcion="Despejado">11</estado_cielo>
<estado_cielo periodo="00-12" descripcion="Despejado">11</estado_cielo>
<estado_cielo periodo="12-24" descripcion="Despejado">11</estado_cielo>
<estado_cielo periodo="00-06" descripcion="Despejado">11n</estado_cielo>
<estado_cielo periodo="06-12" descripcion="Despejado">11</estado_cielo>
<estado_cielo periodo="12-18" descripcion="Despejado">11</estado_cielo>
<estado_cielo periodo="18-24" descripcion="Despejado">11n</estado_cielo>
<viento periodo="00-24">
<direccion>N</direccion>
<velocidad>5</velocidad>
</viento>
<viento periodo="00-12">
<direccion>N</direccion>
<velocidad>5</velocidad>
</viento>
<viento periodo="12-24">
<direccion>N</direccion>
<velocidad>5</velocidad>
</viento>
<viento periodo="00-06">
<direccion>N</direccion>
<velocidad>5</velocidad>
</viento>
<viento periodo="06-12">
<direccion>N</direccion>
<velocidad>5</velocidad>
</viento>
<viento periodo="12-18">
<direccion>C</direccion>
<velocidad>0</velocidad>
</viento>
<viento periodo="18-24">
<direccion>N</direccion>
<velocidad>5</velocidad>
</viento>
<racha_max periodo="00-24"></racha_max>
<racha_max periodo="00-12"></racha_max>
<racha_max periodo="12-24"></racha_max>
<racha_max periodo="00-06"></racha_max>
<racha_max periodo="06-12"></racha_max>
<racha_max periodo="12-18"></racha_max>
<racha_max periodo="18-24"></racha_max>
<temperatura>
<maxima>18</maxima>
<minima>7</minima>
<dato hora="06">8</dato>
<dato hora="12">16</dato>
<dato hora="18">14</dato>
<dato hora="24">8</dato>
</temperatura>
<sens_termica>
<maxima>18</maxima>
<minima>7</minima>
<dato hora="06">8</dato>
<dato hora="12">16</dato>
<dato hora="18">14</dato>
<dato hora="24">8</dato>
</sens_termica>
<humedad_relativa>
<maxima>90</maxima>
<minima>45</minima>
<dato hora="06">90</dato>
<dato hora="12">55</dato>
<dato hora="18">55</dato>
<dato hora="24">85</dato>
</humedad_relativa>
<uv_max>2</uv_max>
</dia>
<dia fecha="2014-12-19">
<prob_precipitacion periodo="00-24">0</prob_precipitacion>
<prob_precipitacion periodo="00-12">0</prob_precipitacion>
<prob_precipitacion periodo="12-24">0</prob_precipitacion>
<cota_nieve_prov periodo="00-24"></cota_nieve_prov>
<cota_nieve_prov periodo="00-12"></cota_nieve_prov>
<cota_nieve_prov periodo="12-24"></cota_nieve_prov>
<estado_cielo periodo="00-24" descripcion="Despejado">11</estado_cielo>
<estado_cielo periodo="00-12" descripcion="Despejado">11</estado_cielo>
<estado_cielo periodo="12-24" descripcion="Despejado">11</estado_cielo>
<viento periodo="00-24">
<direccion>E</direccion>
<velocidad>5</velocidad>
</viento>
<viento periodo="00-12">
<direccion>N</direccion>
<velocidad>5</velocidad>
</viento>
<viento periodo="12-24">
<direccion>E</direccion>
<velocidad>5</velocidad>
</viento>
<racha_max periodo="00-24"></racha_max>
<racha_max periodo="00-12"></racha_max>
<racha_max periodo="12-24"></racha_max>
<temperatura>
<maxima>17</maxima>
<minima>5</minima>
</temperatura>
<sens_termica>
<maxima>17</maxima>
<minima>3</minima>
</sens_termica>
<humedad_relativa>
<maxima>100</maxima>
<minima>60</minima>
</humedad_relativa>
<uv_max>2</uv_max>
</dia>
<dia fecha="2014-12-20">
<prob_precipitacion periodo="00-24">0</prob_precipitacion>
<prob_precipitacion periodo="00-12">0</prob_precipitacion>
<prob_precipitacion periodo="12-24">0</prob_precipitacion>
<cota_nieve_prov periodo="00-24"></cota_nieve_prov>
<cota_nieve_prov periodo="00-12"></cota_nieve_prov>
<cota_nieve_prov periodo="12-24"></cota_nieve_prov>
<estado_cielo periodo="00-24" descripcion="Despejado">11</estado_cielo>
<estado_cielo periodo="00-12" descripcion="Despejado">11</estado_cielo>
<estado_cielo periodo="12-24" descripcion="Despejado">11</estado_cielo>
<viento periodo="00-24">
<direccion>NE</direccion>
<velocidad>5</velocidad>
</viento>
<viento periodo="00-12">
<direccion>N</direccion>
<velocidad>10</velocidad>
</viento>
<viento periodo="12-24">
<direccion>NE</direccion>
<velocidad>5</velocidad>
</viento>
<racha_max periodo="00-24"></racha_max>
<racha_max periodo="00-12"></racha_max>
<racha_max periodo="12-24"></racha_max>
<temperatura>
<maxima>17</maxima>
<minima>5</minima>
</temperatura>
<sens_termica>
<maxima>17</maxima>
<minima>3</minima>
</sens_termica>
<humedad_relativa>
<maxima>100</maxima>
<minima>70</minima>
</humedad_relativa>
<uv_max>2</uv_max>
</dia>
<dia fecha="2014-12-21">
<prob_precipitacion>0</prob_precipitacion>
<cota_nieve_prov></cota_nieve_prov>
<estado_cielo descripcion="Poco nuboso">12</estado_cielo>
<viento>
<direccion>NE</direccion>
<velocidad>5</velocidad>
</viento>
<racha_max></racha_max>
<temperatura>
<maxima>16</maxima>
<minima>4</minima>
</temperatura>
<sens_termica>
<maxima>16</maxima>
<minima>3</minima>
</sens_termica>
<humedad_relativa>
<maxima>95</maxima>
<minima>70</minima>
</humedad_relativa>
<uv_max>2</uv_max>
</dia>
<dia fecha="2014-12-22">
<prob_precipitacion>0</prob_precipitacion>
<cota_nieve_prov></cota_nieve_prov>
<estado_cielo descripcion="Poco nuboso">12</estado_cielo>
<viento>
<direccion>E</direccion>
<velocidad>10</velocidad>
</viento>
<racha_max></racha_max>
<temperatura>
<maxima>18</maxima>
<minima>8</minima>
</temperatura>
<sens_termica>
<maxima>18</maxima>
<minima>7</minima>
</sens_termica>
<humedad_relativa>
<maxima>95</maxima>
<minima>75</minima>
</humedad_relativa>
</dia>
<dia fecha="2014-12-23">
<prob_precipitacion>0</prob_precipitacion>
<cota_nieve_prov></cota_nieve_prov>
<estado_cielo descripcion="Poco nuboso">12</estado_cielo>
<viento>
<direccion>NE</direccion>
<velocidad>10</velocidad>
</viento>
<racha_max></racha_max>
<temperatura>
<maxima>17</maxima>
<minima>6</minima>
</temperatura>
<sens_termica>
<maxima>17</maxima>
<minima>4</minima>
</sens_termica>
<humedad_relativa>
<maxima>95</maxima>
<minima>65</minima>
</humedad_relativa>
</dia>
</prediccion>
答案 0 :(得分:1)
@ECHO OFF
SETLOCAL
FOR /f "tokens=1,3,4delims=<> " %%a IN ('findstr /L "prob_precipitacion" q27584352.txt^|findstr /L /c:"periodo=\"00-24\"" ') DO (
IF "%%c"=="" (ECHO 0) ELSE (ECHO %%b)
)
GOTO :EOF
我使用了一个名为q27584352.txt
的文件,其中包含我的测试数据。
在您发布的代码中,在for /f .. %%A..
循环之后,批处理将简单地执行下一行和下一行,直到它实际终止于exit/b
,最后执行了:f_extractData
子例程时间,使用程序的第一个参数%1
。批处理没有sections
的概念,并且不会停止或神奇地跳过标记的例程。
标签:EOF
内置于cmd
- 这意味着&#34;此批处理文件的结尾&#34;并且不需要明确声明(事实上,我认为将它当作非常糟糕的做法)
只需执行
goto :eof
在for...%%A...
退出程序后 - 批处理知道:eof
在哪里(但冒号是强制性的。)
在这种情况下,您也可以使用goto :eof
代替exit /b
。到达eof
会终止子程序,因此批次会在call
后重新运行到instaruction。
修改过滤器中包含^|findstr /L /c:"periodo=\"00-24\""
以消除不包含periodo="00-24"
的行
留下4行,而不是符合要求的7行。
答案 1 :(得分:0)
您错过了很多双引号,以避免<
,>
和"
被解释为具有特殊的命令行含义。
但是,使用 FOR 命令而不是环境变量替换,可以更好地分割线条。
@echo off
setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq tokens=1-4 delims=<>= " %%A in ("%~1") do (
set "TagName=%%A"
set "AttributeName=%%B"
set "AttributeValue=%%~C"
set "TagValue=%%D"
if "!TagName!"=="prob_precipitacion" (
if "!AttributeName!"=="periodo" (
if "!AttributeValue!"=="00-24" (
if "!TagValue:~0,1!"=="/" set "TagValue=0"
echo !TagValue!
)
)
)
set "TagName="
set "AttributeName="
set "AttributeValue="
set "TagValue="
)
endlocal
修改强>
通过在分隔符字符列表中的等号和空格字符之间添加水平制表符,带有标记1到4的 for 命令将独立于XML文件中的缩进。
for /F "usebackq tokens=1-4 delims=<>= " %%A in ("%~1") do (
delims=
之后有5个字符:
分隔符的顺序很重要,否则命令行解释器会因语法错误退出批处理脚本。
通过这种修改,XML行可以缩进空格或带有制表符或者根本不缩进,但结果总是相同的。
答案 2 :(得分:0)
最后,我发现解决方案使用了第二个答案中的大多数代码(Mofi的答案)并进行了一些更改。这是列出我在xml文件中寻找的七个目标值的最终代码:
@echo off
setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq tokens=1-5 delims=<>= " %%A in ("aemet20141217.xml") do (
set "TagName=%%B"
set "AttributeName=%%C"
set "AttributeValue=%%D"
set "TagValue=%%E"
if "!TagName!"=="prob_precipitacion" (
if "!AttributeName!"=="periodo" (
if "!AttributeValue!"==""00-24"" (
if "!TagValue:~0,1!"=="/" set "TagValue=0"
echo !TagValue!
)
)
if "!AttributeName!" NEQ "periodo" (
set "TagValue=!AttributeName!"
if "!AttributeName:~0,1!"=="/" set "TagValue=0"
echo !TagValue!
)
)
set "TagName="
set "AttributeName="
set "AttributeValue="
set "TagValue="
)
endlocal
注意:由于第一个空项目,for / F行中的分割导致5个项目(不是Mofi原始代码预测的4个项目)。这是原始代码不起作用的主要原因。