解析xml树的属性(文件中没有元素)

问题描述:

我一直在尝试使用minidom,但没有真正的偏好。出于某种原因,lxml不会安装在我的机器上。解析xml树的属性(文件中没有元素)

我想解析XML文件:

<?xml version="1. 
    -<transfer frmt="1" vtl="0" serial_number="E5XX-0822" date="2016-10-03 16:34:53.000" style="startstop"> 
     -<plateInfo> 
       <plate barcode="E0122326" name="384plate" type="source"/> 
       <plate barcode="A1234516" name="1536plateD" type="destination"/> 
     </plateInfo> 
     -<printmap total="1387"> 
      <w reason="" cf="13" aa="1.779" eo="299.798" tof="32.357" sv="1565.311" ct="1.627" ft="1.649" fc="88.226" memt="0.877" fldu="Percent" fld="DMSO" dy="0" dx="0" region="-1" tz="18989.481" gy="72468.649" gx="55070.768" avt="50" vt="50" vl="3.68" cvl="3.63" t="16:30:47.703" dc="0" dr="0" dn="A1" c="0" r="0" n="A1"/> 
      <w reason="" cf="13" aa="1.779" eo="299.798" tof="32.357" sv="1565.311" ct="1.627" ft="1.649" fc="88.226" memt="0.877" fldu="Percent" fld="DMSO" dy="0" dx="0" region="-1" tz="18989.481" gy="72468.649" gx="55070.768" avt="50" vt="50" vl="3.68" cvl="3.63" t="16:30:47.703" dc="0" dr="0" dn="A1" c="1" r="0" n="A2"/> 
     </printmap> 
    </transfer> 

的文件没有任何元素的细节,你可以看到。所有信息都包含在属性中。为了适应另一个SO帖子,我有这个 - 但它似乎更多地面向元素。我也失败了一个很好的方式来“浏览”xml信息,即我想说“dir(xml_file)”,并列出了我可以在我的树结构上执行的所有方法,或者查看所有属性。我知道这是很多和可能不同的方向,但提前谢谢你!

def parse(files): 
    for xml_file in files: 
     xmldoc = minidom.parse(xml_file) 
     transfer = xmldoc.getElementsByTagName('transfer')[0] 
     plateInfo = transfer.getElementsByTagName('plateInfo')[0] 
+0

有没有使用ElementTree的一个原因 - 雅知道,[Python标准库中提供的那个](https://docs.python.org/2/library/xml.etree.elementtree.html)? “minidom”是最老的开箱即用的XML库之一,它显示出来了。 –

随着minidom命名可以访问使用该方法的属性,然后可以作为字典来治疗的特定元素的属性;这个例子迭代并打印元素迁移[0]的属性:

from xml.dom.minidom import parse, parseString 
xml_file='''<?xml version="1.0" encoding="UTF-8"?> 
    <transfer frmt="1" vtl="0" serial_number="E5XX-0822" date="2016-10-03 16:34:53.000" style="startstop"> 
     <plateInfo> 
       <plate barcode="E0122326" name="384plate" type="source"/> 
       <plate barcode="A1234516" name="1536plateD" type="destination"/> 
     </plateInfo> 
     <printmap total="1387"> 
      <w reason="" cf="13" aa="1.779" eo="299.798" tof="32.357" sv="1565.311" ct="1.627" ft="1.649" fc="88.226" memt="0.877" fldu="Percent" fld="DMSO" dy="0" dx="0" region="-1" tz="18989.481" gy="72468.649" gx="55070.768" avt="50" vt="50" vl="3.68" cvl="3.63" t="16:30:47.703" dc="0" dr="0" dn="A1" c="0" r="0" n="A1"/> 
      <w reason="" cf="13" aa="1.779" eo="299.798" tof="32.357" sv="1565.311" ct="1.627" ft="1.649" fc="88.226" memt="0.877" fldu="Percent" fld="DMSO" dy="0" dx="0" region="-1" tz="18989.481" gy="72468.649" gx="55070.768" avt="50" vt="50" vl="3.68" cvl="3.63" t="16:30:47.703" dc="0" dr="0" dn="A1" c="1" r="0" n="A2"/> 
     </printmap> 
    </transfer>''' 
xmldoc = parseString(xml_file) 
transfer = xmldoc.getElementsByTagName('transfer') 
attlist= transfer[0].attributes.keys() 
for a in attlist: 
    print transfer[0].attributes[a].name,transfer[0].attributes[a].value 

,你可以在这里找到更多的信息:

http://www.diveintopython.net/xml_processing/attributes.html