Python 使用minidom获取xml文件中的嵌套元素时出现问题
我试图用python为一个项目解析一个“xml”文件 我希望代码通过xml进行解析,并获取每个过程的信息。这些信息将作为python字典返回 具体来说,我将遍历每个过程元素,并获取关于其数据名称和类型的信息 目前,我的代码如下 问题是Data2不是正确的对象类型,因此我无法横向进入变量层。Python 使用minidom获取xml文件中的嵌套元素时出现问题,python,xml,xml-parsing,minidom,Python,Xml,Xml Parsing,Minidom,我试图用python为一个项目解析一个“xml”文件 我希望代码通过xml进行解析,并获取每个过程的信息。这些信息将作为python字典返回 具体来说,我将遍历每个过程元素,并获取关于其数据名称和类型的信息 目前,我的代码如下 问题是Data2不是正确的对象类型,因此我无法横向进入变量层。 我不明白为什么我不能一直使用getElementsByTagName遍历每一层 在完整的代码中,我将对每个数据执行此操作,我应该期望为过程指定“无”或空节点。然后,代码应该能够处理这个问题(除了检查Data2
我不明白为什么我不能一直使用getElementsByTagName遍历每一层 在完整的代码中,我将对每个数据执行此操作,我应该期望为过程指定“无”或空节点。然后,代码应该能够处理这个问题(除了检查Data2Element是否正确之外,不知道如何处理它)。如果建议的解决方案使用另一种方法,那就好了 因此,问题是如何在python中处理xml文档中的空节点 注意:我无法控制文件格式,我有“标准”python 3.3模块,包括xml.dom和xml.etree,此外我还有漂亮的汤(但没有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>
描述1。
六月一日
描述2。
说明3
说明4
说明5
六月二日
数据2
是元素列表,而不是单个元素。您可以这样修改代码:
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
你有具体的问题吗?