如何解析XML文件以获取标签值和处理比和双引号字符更大? [英] How to parse an XML file to get tag values and handle greater than and double quote characters?

查看:387
本文介绍了如何解析XML文件以获取标签值和处理比和双引号字符更大?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我怎么能使用批处理文件从XML文件中提取信息?

How could I extract information from an XML file using batch files?

这是code我想:

@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

不过,阅读下面的线路时失败:

But it fails when reading the following lines:

<prob_precipitacion periodo="00-24"></prob_precipitacion>
<prob_precipitacion periodo="00-24">0</prob_precipitacion>
<prob_precipitacion periodo="00-24">25</prob_precipitacion>

的结果值应为第一行,0为用于第三线的第二行和25为0。但是我用提取字符串的一部分的尝试

The result values should be 0 for the first line, 0 for the second line and 25 for the third line. But my tries of extracting part of the string using

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

在这些线上失败。我想这将失败,因为的制造&gt; 字符,但我不知道我怎么会删除这些字符来管理这个问题。

fails on those lines. I guess it fails because of the > and " characters. But I don't know how could I remove those characters to manage with this.

任何想法?

下面是完整的XML我使用的测试:

Here is the full xml I am using to test:

<?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>&#169; 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>

推荐答案

您错过很多双引号,以避免&LT; &GT; 不被跨preTED与他们特殊的命令行的意义。

You miss lots of double quotes to avoid that <, > and " are not being interpreted with their special command line meanings.

然而,分裂的线条与做得更好作为命令,而不是环境变量替换。

However, splitting up the lines is done better with FOR command instead of environment variable substitutions.

@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将在XML文件中压痕独立工作。

By adding the horizontal tab character between equal sign and the space character in the list of delimiter characters, the for command with the tokens 1 to 4 would work independent on indentations in XML file.

for /F "usebackq tokens=1-4 delims=<>=   " %%A in ("%~1") do (

有5个字符后 delims =


  1. 左尖括号,

  2. 右尖括号,

  3. 等号,

  4. 一个水平制表符的(不是空格作为浏览器的显示顺序)

  5. 一个空格字符。

分隔符字符的顺序,否则命令行间preTER重要的会退出,因为语法错误的批处理脚本。

The order of the delimiter characters is important as otherwise command line interpreter would exit batch script because of a syntax error.

通过此修改的XML行可以用空格或制表符缩进或根本没有缩进,其结果将是仍然始终相同。

With this modification the XML lines can be indented with spaces or with tabs or not indented at all and the result would be nevertheless always identical.

这篇关于如何解析XML文件以获取标签值和处理比和双引号字符更大?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆