如何parsingXML文件以获取标记值并处理大于和双引号字符?

我怎样才能使用batch file从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。 但我尝试使用提取部分string

 set data="%data:~37,-22%" 

在这些线路上失败。 我猜这是因为""字符而失败,但我不知道如何删除这些字符来pipe理这个。

有任何想法吗?

这里是我用来testing的完整的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> 

你错过了大量的双引号,以避免<>"不被解释为具有特殊的命令行含义。

但是,使用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个字符:

  1. 左尖括号,
  2. 一个直角支架,
  3. 等号,
  4. 水平制表符(不是浏览器显示的空格序列)
  5. 一个单一的空间字符。

分隔符的顺序非常重要,否则命令行解释器会由于语法错误而退出批处理脚本。

通过这种修改,XML行可以用空格或制表符缩进或者不缩进,结果总是相同的。

 @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的文件, q27584352.txt包含您的数据用于测试。

在您的发布代码中,在for /f .. %%A..循环之后,batch将简单地执行下一行,直到它在exit/b实际终止,最后一次执行:f_extractData子例程程序的第一个参数为%1 。 批量没有sections概念,不停止或神奇地跳过标签的例程。

标签:EOF内置到cmd – 这意味着“这个批处理文件的结束”,不需要明确声明(事实上,我相信这是非常糟糕的做法,删除它)

简单地执行

 goto :eof 

之后你for...%%A...将退出程序 – 批量知道在哪里:eof是(但结肠是强制性的)。

在这种情况下,您也可以使用goto :eof来代替exit /b 。 到达eof终止子程序,因此在call之后,批次重新回到instuction。

编辑在过滤器中包含^|findstr /L /c:"periodo=\"00-24\""以消除不包含periodo="00-24"

留下4行,不符合要求的7行。

最后,我找到了解决方案,使用第二个答案(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个项目)。 这是原始代码不起作用的主要原因。