当前位置: 首页 > 面试题库 >

将XML文件解析为Python对象

阎志义
2023-03-14
问题内容

我有一个看起来像这样的XML文件

<encspot>
  <file>
   <Name>some filename.mp3</Name>
   <Encoder>Gogo (after 3.0)</Encoder>
   <Bitrate>131</Bitrate>
   <Mode>joint stereo</Mode>
   <Length>00:02:43</Length>
   <Size>5,236,644</Size>
   <Frame>no</Frame>
   <Quality>good</Quality>
   <Freq.>44100</Freq.>
   <Frames>6255</Frames>
   ..... and so forth ......
  </file>
  <file>....</file>
</encspot>

我想将其读入python对象,类似于字典列表。因为标记是绝对固定的,所以我很想使用正则表达式(我非常擅长使用那些正则表达式)。但是,我想我会检查是否有人知道如何在此处轻松避免使用正则表达式。我对SAX或其他解析没有太多经验,但是我愿意学习。

我期待向您展示如何在不使用regexes的情况下快速完成此操作。谢谢你的帮助!


问题答案:

如果您认为正则表达式比这更简单,那么我心爱的SD Chargers帽子就不适合您使用:

#!/usr/bin/env python
import xml.etree.cElementTree as et

sxml="""
<encspot>
  <file>
   <Name>some filename.mp3</Name>
   <Encoder>Gogo (after 3.0)</Encoder>
   <Bitrate>131</Bitrate>
  </file>
  <file>
   <Name>another filename.mp3</Name>
   <Encoder>iTunes</Encoder>
   <Bitrate>128</Bitrate>  
  </file>
</encspot>
"""
tree=et.fromstring(sxml)

for el in tree.findall('file'):
    print '-------------------'
    for ch in el.getchildren():
        print '{:>15}: {:<30}'.format(ch.tag, ch.text)

print "\nan alternate way:"  
el=tree.find('file[2]/Name')  # xpath
print '{:>15}: {:<30}'.format(el.tag, el.text)

输出:

-------------------
           Name: some filename.mp3             
        Encoder: Gogo (after 3.0)              
        Bitrate: 131                           
-------------------
           Name: another filename.mp3          
        Encoder: iTunes                        
        Bitrate: 128

an alternate way:
           Name: another filename.mp3

如果您对正则表达式的吸引力不那么强,那么下面的列表理解功能同样令人难以理解,可以创建数据结构:

[(ch.tag,ch.text) for e in tree.findall('file') for ch in e.getchildren()]

<file>以文档顺序创建XML子级的元组列表:

[('Name', 'some filename.mp3'), 
 ('Encoder', 'Gogo (after 3.0)'), 
 ('Bitrate', '131'), 
 ('Name', 'another filename.mp3'), 
 ('Encoder', 'iTunes'), 
 ('Bitrate', '128')]

显然,只要多花点时间,再多加一点考虑,就可以使用ElementTree从XML创建所需的任何数据结构。它是Python发行版的一部分。

编辑

高尔夫代码开了!

[{item.tag: item.text for item in ch} for ch in tree.findall('file')] 
[ {'Bitrate': '131', 
   'Name': 'some filename.mp3', 
   'Encoder': 'Gogo (after 3.0)'}, 
  {'Bitrate': '128', 
   'Name': 'another filename.mp3', 
   'Encoder': 'iTunes'}]

如果您的XML仅包含该file部分,则可以选择您的高尔夫。如果您的XML有其他标签,其他部分,则需要说明孩子所在的部分,并且需要使用findall

在Effbot.org上有关于ElementTree的教程。



 类似资料:
  • 问题内容: Goodreads网站具有用于访问用户“货架”的API:https : //www.goodreads.com/review/list/20990068.xml? key=nGvCqaQ6tn9w4HNpW8kquw &v=2&shelf=toread 它返回XML。我正在尝试创建一个django项目,该项目通过此API在书架上显示书籍。我正在寻找一种方法(或者是否有比该方法更好的方法

  • 我尝试使用DocumentBuilderFactory解析XML文件,如下所示: 其中ndsFileInputStream是一个InputStream,包装包含XML的文件。 当文件包含Unicode字符(如Δ)时,会出现异常。当我去掉包含违规字符的行时,解析工作正常。 该文件包含特征

  • 我有一个XML文件,其中包含大量员工记录(比如高达1M),如下所示: 我使用JAXB将员工记录映射到以下Java对象: XML的内容不能被更改,并且给定这个XML,我如何使用JAXB将每个员工XML记录解封给员工对象,以便我可以逐个处理它?

  • 本文向大家介绍python解析xml文件实例分析,包括了python解析xml文件实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python解析xml文件的方法。分享给大家供大家参考。具体如下: python解析xml非常方便。在dive into python中也有讲解。 如果xml的结构如下: 第三个book是没有title标记的。由于不要相信代码输入,所以在代码中要做检查(

  • 问题内容: 我有一个XML文件,例如 如何将其解析为JSON结构文件? 问题答案: 对于一个简单的解决方案,我建议使用Jackson库,它是一个Java库,用于生成和读取带有XML扩展名的JSON,因为它只需几行简单的代码就可以将任意复杂的XML转换为JSON。 input.xml Java代码: 该演示使用Jackson 1.7.7 (较新的1.7.8也可以使用),Jackson XML Dat

  • 我有一些信息存储在XML中,我需要解析XML并将一些值存储在Hashmap中。以下是XML: 我想要的关键是:Room1和值:16.412094,48.19719(例如为部分ID=1) 这是第一部分的示例。我有100多个部分,所以我想像我在第一个示例中解释的那样为每个部分存储键和值。 输出为: 房间1: 16.412094,48.19719;房间2: 16.369865,48.199006; 房间