Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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中的xml元素属性到列表中_Python_Xml - Fatal编程技术网

python中的xml元素属性到列表中

python中的xml元素属性到列表中,python,xml,Python,Xml,我有一个类似xml的列表,我的目标是将每个对位的X和Y放在一个列表中。如何在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">

我有一个类似xml的列表,我的目标是将每个对位的X和Y放在一个列表中。如何在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>

结帐


第一个近似值可以是:

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)
资料来源:


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

这里有一种使用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())
data=”“”
"""
导入xml.sax
类AssemblyHandler(xml.sax.ContentHandler):
def startElement(自身、名称、属性):
如果名称==“零件”:
打印(“部分”)
elif名称==“轮廓点”:
打印(attrs.get('X')、attrs.get('Y'))
parseString(数据,AssemblyHandler())

找到具有各自标记名的所有标记(在本例中为属性“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]

谢谢你,它做的很好。
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')]