gpt4 book ai didi

python - 使用 minidom 在 xml 文件中获取嵌套元素的问题

转载 作者:太空宇宙 更新时间:2023-11-03 18:04:16 25 4
gpt4 key购买 nike

我正在尝试在 python 中解析项目的“xml”文件。

我希望代码能够解析 xml 并获取每个过程的信息。这些信息将作为 python 字典返回。

具体来说,我将向下遍历每个过程元素并获取有关其数据#名称和类型的信息。

目前,我的代码如下。

问题是 Data2 的对象类型不正确,因此我无法横向进入变量层。
我不明白为什么我不能继续使用 getElementsByTagName 来遍历每一层。

在完整的代码中,我将为每个 Data# 执行此操作,并且我应该期望为过程指定“无”或空节点。然后应该期望代码能够处理这个问题(当除了检查是否有 Data2Element 之外什么都没有时,不知道如何处理它)。如果建议的解决方案使用另一种方法就好了。

因此问题是我应该如何在 python 中处理 xml 文档中的空节点。

注意:我无法控制文件格式,我有“标准”python 3.3 模块,因此包括 xml.dom 和 xml.etree,另外我还有 Beautiful Soup (但没有 lxml) 。我无法安装“lxml”或其他尚未安装的内容。如果我的解决方案需要的话,我很乐意切换到其他已安装的模块之一。

filename = 'TestProc.xml'
from xml.dom import minidom

xmldoc = minidom.parse(filename)

procedureList = xmldoc.getElementsByTagName('Procedure')

varName=[]
varType=[]
for procElement in procedureList:
Data2 = procElement.getElementsByTagName('Data2')
varElements = Data2.getElementsByTagName('Variable')
for varElemTmp in varElements:
varName.append(varElemTmp.getAttribute('name'))
varType.append(varElemTmp.getAttribute('type'))

其中 TestProc.xml 如下。

<?xml version="1.0" encoding="utf-8"?>
<ProcedureSet xmlns:xs="htt//www.w3.org/2001/XMLSchema">
<GlobalCode>
<CodeBlock id="Code1">
</CodeBlock>
<CodeBlock id="Code2">
</CodeBlock>
<CodeBlock id="Code3">
</CodeBlock>
</GlobalCode>
<Procedures>
<Procedure id="Proc1" displayToUser="false" expectedType="Type1">
<Description>Description1.</Description>
<Data1 />
<Data2 />
<Data3 />
<Data4 />
<MainCode id="main">
Junk1
</MainCode>
</Procedure>
<Procedure id="Proc2" displayToUser="false" expectedType="Type2">
<Description>Description2.</Description>
<Data1 />
<Data2>
<Variable name="Var1" type="bool" causesChange="false">
<description>Description3</description>
</Variable>
</Data2>
<Data3>
<Variable name="Var2" type="bool" causesChange="false">
<description>Description4</description>
</Variable>
<Variable name="Var3" type="int" causesChange="false">
<description>Description5</description>
</Variable>
</Data3>
<Data4>
<Variable name="Var4" type="link" />
<Variable name="Var5" type="link" />
</Data4>
<MainCode id="main">
Junk2
</MainCode>
</Procedure>
</Procedures>
</ProcedureSet>

最佳答案

Data2 是元素列表,而不是单个元素。您可以像这样修改代码:

for procElement in procedureList:
ListOfData2 = procElement.getElementsByTagName('Data2')
for Data2 in ListOfData2:
varElements = Data2.getElementsByTagName('Variable')
for varElemTmp in varElements:
varName.append(varElemTmp.getAttribute('name'))
varType.append(varElemTmp.getAttribute('type'))

如果您确实切换到 ElementTree,则可以使用 XPath 语法来节省一些循环:

filename = 'TestProc.xml'
import xml.etree.ElementTree as ET

xmldoc = ET.parse(filename)

variables = xmldoc.findall(".//Procedure/Data2/Variable")

varName=[e.get('name') for e in variables]
varType=[e.get('type') for e in variables]

print varName, varType

关于python - 使用 minidom 在 xml 文件中获取嵌套元素的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27162339/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com