2017-05-16 104 views
0

我有一个xml列表,我的goad是将每个counterPoint的X和Y放在一个列表中。如何在python中实现这个?先谢谢你。xml元素属性到python列表中

<Assembly> 
    <Part ASSEMBLY_POS="A12G3" PART_ID="2612666" PART_POS="Y366" MATERIAL="SN490B" PROFILE="PL12"> 
    <ContourPoint X="19700.001848" Y="21760.00407" Z="37863"> 
     <Chamfer DZ1="0" DZ2="0" TYPE="CHAMFER_NONE" X="0" Y="0" /> 
    </ContourPoint> 
    <ContourPoint X="19700.001848" Y="21760.00407" Z="38213"> 
     <Chamfer DZ1="0" DZ2="0" TYPE="CHAMFER_NONE" X="0" Y="0" /> 
    </ContourPoint> 
    <ContourPoint X="20018.001848" Y="21760.00407" Z="38213"> 
     <Chamfer DZ1="0" DZ2="0" TYPE="CHAMFER_ARC" X="35" Y="35" /> 
    </ContourPoint> 
    <ContourPoint X="20018.001848" Y="21760.00407" Z="37507"> 
     <Chamfer DZ1="0" DZ2="0" TYPE="CHAMFER_ARC" X="35" Y="35" /> 
    </ContourPoint> 
    <ContourPoint X="19820.001848" Y="21760.00407" Z="37507"> 
     <Chamfer DZ1="0" DZ2="0" TYPE="CHAMFER_NONE" X="0" Y="0" /> 
    </ContourPoint> 
    <ContourPoint X="19820.001848" Y="21760.00407" Z="37863"> 
     <Chamfer DZ1="0" DZ2="0" TYPE="CHAMFER_ROUNDING" X="15" Y="0" /> 
    </ContourPoint> 
    </Part> 

</Assembly> 

回答

0

一级近似可能是这样的:

import xml.etree.ElementTree as ET 

tree = ET.parse('file.xml') 
root = tree.getroot() 

# Or from a variable 
# root = ET.fromstring(data_as_string) 

part = root.getchildren()[0] 

points = [] 
for child in part: 
    points.append((float(child.attrib['X']), float(child.attrib['Y']))) 

print(points) 

来源:https://docs.python.org/3.5/library/xml.etree.elementtree.html

警告xml.etree.ElementTree模块是不安全的反对恶意构建的数据。如果您需要解析不可信或未经身份验证的数据,请参阅XML漏洞。

+0

谢谢,它按预期完成了这项工作。 – kemz

0

下面是使用sax解析的替代方法,对于这类数据可能更简单一些。

data = """<?xml version="1.0"?> 
<Assembly> 
<Part ASSEMBLY_POS="A12G3" PART_ID="2612666" PART_POS="Y366" MATERIAL="SN490B" PROFILE="PL12"> 
    <ContourPoint X="19700.001848" Y="21760.00407" Z="37863"> 
    <Chamfer DZ1="0" DZ2="0" TYPE="CHAMFER_NONE" X="0" Y="0" /> 
    </ContourPoint> 
    <ContourPoint X="19700.001848" Y="21760.00407" Z="38213"> 
    <Chamfer DZ1="0" DZ2="0" TYPE="CHAMFER_NONE" X="0" Y="0" /> 
    </ContourPoint> 
    <ContourPoint X="20018.001848" Y="21760.00407" Z="38213"> 
    <Chamfer DZ1="0" DZ2="0" TYPE="CHAMFER_ARC" X="35" Y="35" /> 
    </ContourPoint> 
    <ContourPoint X="20018.001848" Y="21760.00407" Z="37507"> 
    <Chamfer DZ1="0" DZ2="0" TYPE="CHAMFER_ARC" X="35" Y="35" /> 
    </ContourPoint> 
    <ContourPoint X="19820.001848" Y="21760.00407" Z="37507"> 
    <Chamfer DZ1="0" DZ2="0" TYPE="CHAMFER_NONE" X="0" Y="0" /> 
    </ContourPoint> 
    <ContourPoint X="19820.001848" Y="21760.00407" Z="37863"> 
    <Chamfer DZ1="0" DZ2="0" TYPE="CHAMFER_ROUNDING" X="15" Y="0" /> 
    </ContourPoint> 
</Part> 

</Assembly> 
""" 

import xml.sax 

class AssemblyHandler(xml.sax.ContentHandler): 
    def startElement(self, name, attrs): 
     if name == "Part": 
      print("PART") 
     elif name == "ContourPoint": 
      print(attrs.get('X'), attrs.get('Y')) 

xml.sax.parseString(data, AssemblyHandler()) 
0

找到所有与相应的标签名称的标签(在这种情况下有属性“X”和“Y”),并通过结果迭代使用列表理解来获得属性值列表!

data='''<Assembly> 
    <Part ASSEMBLY_POS="A12G3" PART_ID="2612666" PART_POS="Y366" MATERIAL="SN490B" PROFILE="PL12"> 
    <ContourPoint X="19700.001848" Y="21760.00407" Z="37863"> 
     <Chamfer DZ1="0" DZ2="0" TYPE="CHAMFER_NONE" X="0" Y="0" /> 
    </ContourPoint> 
    <ContourPoint X="19700.001848" Y="21760.00407" Z="38213"> 
     <Chamfer DZ1="0" DZ2="0" TYPE="CHAMFER_NONE" X="0" Y="0" /> 
    </ContourPoint> 
    <ContourPoint X="20018.001848" Y="21760.00407" Z="38213"> 
     <Chamfer DZ1="0" DZ2="0" TYPE="CHAMFER_ARC" X="35" Y="35" /> 
    </ContourPoint> 
    <ContourPoint X="20018.001848" Y="21760.00407" Z="37507"> 
     <Chamfer DZ1="0" DZ2="0" TYPE="CHAMFER_ARC" X="35" Y="35" /> 
    </ContourPoint> 
    <ContourPoint X="19820.001848" Y="21760.00407" Z="37507"> 
     <Chamfer DZ1="0" DZ2="0" TYPE="CHAMFER_NONE" X="0" Y="0" /> 
    </ContourPoint> 
    <ContourPoint X="19820.001848" Y="21760.00407" Z="37863"> 
     <Chamfer DZ1="0" DZ2="0" TYPE="CHAMFER_ROUNDING" X="15" Y="0" /> 
    </ContourPoint> 
    </Part> 
</Assembly>''' 
import xml.etree.ElementTree as ET 
root = ET.fromstring(data) 
points = root.findall('.//ContourPoint') 
print [(each.attrib['X'],each.attrib['Y']) for each in points] 

输出:

[('19700.001848', '21760.00407'), ('19700.001848', '21760.00407'), ('20018.001848', '21760.00407'), ('20018.001848', '21760.00407'), ('19820.001848', '21760.00407'), ('19820.001848', '21760.00407')]