使用 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)
我正在尝试使用 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)