繁体   English   中英

使用ElementTree在Python中按元素解析XML

[英]Parsing XML by element in Python using ElementTree

我正在尝试在Python中使用ElementTree来解析一些本地XML文件,并删除所有没有“ DVC”父标记的元素。 但是,以下代码仍将带有“ DVC”以外的标签的元素(特别是“ PFD”和“ CTR”)传递到我的输出XML文件中:

exp_root = etree.parse(dm_files_path + "\\Export\\" + display_name + "\\TASKDATA.XML")
root = exp_root.getroot()

for child in root:
    if child.tag !='DVC':
        root.remove(child)

exp_root.write(dm_files_path + "\\Export\\" + display_name + '\\TASKDATA_Disp.XML')

这是运行代码之前的XML文件示例:

<?xml version="1.0" encoding="UTF-8"?>
<TaskData VersionMajor="4" VersionMinor="2" Taskr="" Version="201" DataTransferOrigin="2">
    <TSK A="TSK-1" B="Fi" C="CTR-1" D="FRM-1" E="PFD-1" G="2">
        <TLG A="TLG00000" C="1"/>
        <TIM A="2019-08-22T16:33:39.824+00:00" D="4"/>
        <OTP A="CPC-1"/>
        <DAN A="A00C80000C40B6BC" B="FFFFFFFFFFFFFFFF" C="DVC-1">
            <ASP A="2019-08-22T16:33:40" D="4">
                <PTN A="41.7616234560" B="-87.9292605396" D="1"/>
            </ASP>
        </DAN>
    </TSK>
    <PFD A="PFD-1" C="NoField" D="0" E="CTR-1" F="FRM-1"/>
    <FRM A="FRM-1" B="NoFarm" I="CTR-1"/>
    <CTR A="CTR-1" B="NoGrower"/>
    <CPC A="CPC-1" B="SPRAYING"/>
    <DVC A="DVC-1" B="Sprayer" C="02.00.01 " D="A00C80000C40B6BC" E="  30397040 Z12338" F="3037313131464C" G="FF565A005F6E65">
        <DVP A="6001" B="0" C="0.2641719878" D="0" E="gal"/>
        <DVP A="6003" B="0" C="0.0002471050" D="2" E="ac"/>
        <DVP A="6004" B="0" C="0.0000006214" D="2" E="mi"/>
        <DVP A="6005" B="0" C="0.0002777780" D="2" E="hours"/>
        <DVP A="6006" B="0" C="0.0393701009" D="0" E="in"/>
        <DVP A="6008" B="0" C="0.0002641720" D="2" E="gal"/>
        <DVP A="6010" B="0" C="0.0000106907" D="4" E="gal/ac"/>
        <DPT A="4003" B="009D" C="2" D="Connector Type"/>
        <DPT A="4484" B="00B3" C="3" D="Operation Type (ACP)"/>
    </DVC>
<TaskData>

这是生成的XML文件输出:

<TaskData VersionMajor="4" VersionMinor="2" Taskr="" Version="201" DataTransferOrigin="2">
    <PFD A="PFD-1" C="NoField" D="0" E="CTR-1" F="FRM-1"/>
    <CTR A="CTR-1" B="NoGrower"/>
    <DVC A="DVC-1" B="Sprayer" C="02.00.01 " D="A00C80000C40B6BC" E="  30397040 Z12338" F="3037313131464C" G="FF565A005F6E65">
        <DVP A="6001" B="0" C="0.2641719878" D="0" E="gal"/>
        <DVP A="6003" B="0" C="0.0002471050" D="2" E="ac"/>
        <DVP A="6004" B="0" C="0.0000006214" D="2" E="mi"/>
        <DVP A="6005" B="0" C="0.0002777780" D="2" E="hours"/>
        <DVP A="6006" B="0" C="0.0393701009" D="0" E="in"/>
        <DVP A="6008" B="0" C="0.0002641720" D="2" E="gal"/>
        <DVP A="6010" B="0" C="0.0000106907" D="4" E="gal/ac"/>
        <DPT A="4003" B="009D" C="2" D="Connector Type"/>
        <DPT A="4484" B="00B3" C="3" D="Operation Type (ACP)"/>
    </DVC>
<TaskData>

如前所述,我希望“ if child.tag!='DVC':root.remove(child)”删除所有没有“ DVC”标签的元素。 但是,如我的输出XML文件的图片所示,带有“ DVC”以外的标签的某些元素没有被删除。

任何有关此问题的帮助将不胜感激。 我在线阅读了ElementTree文档,但对于为什么会发生这种情况我仍然感到困惑。

谢谢!

您不能迭代一个集合( child in root )并同时更改该集合,这将始终产生不可预测的结果。

将要处理的项目复制到列表中,然后迭代该列表:

elems_to_delete = [child for child in root if child.tag != 'DVC']

for elem in elems_to_delete:
    root.remove(elem)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM