Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用minidom获取xml文件中的嵌套元素时出现问题_Python_Xml_Xml Parsing_Minidom - Fatal编程技术网

Python 使用minidom获取xml文件中的嵌套元素时出现问题

Python 使用minidom获取xml文件中的嵌套元素时出现问题,python,xml,xml-parsing,minidom,Python,Xml,Xml Parsing,Minidom,我试图用python为一个项目解析一个“xml”文件 我希望代码通过xml进行解析,并获取每个过程的信息。这些信息将作为python字典返回 具体来说,我将遍历每个过程元素,并获取关于其数据名称和类型的信息 目前,我的代码如下 问题是Data2不是正确的对象类型,因此我无法横向进入变量层。 我不明白为什么我不能一直使用getElementsByTagName遍历每一层 在完整的代码中,我将对每个数据执行此操作,我应该期望为过程指定“无”或空节点。然后,代码应该能够处理这个问题(除了检查Data2

我试图用python为一个项目解析一个“xml”文件

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

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

目前,我的代码如下

问题是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

你有具体的问题吗?