Python xmltodict将非类型输出转换为列表

Python xmltodict将非类型输出转换为列表,python,xmltodict,Python,Xmltodict,我有一个来自xmltodict的基本示例,它紧跟着github项目页面上给出的示例 def handle(_, book): print(book['title']) return True with open(r'C:\Users\u369811\books.xml', 'r') as f: FILE = f.read() OUTPUT = xmltodict.parse((FILE), item_depth=2, item_callback=handle)

我有一个来自xmltodict的基本示例,它紧跟着github项目页面上给出的示例

def handle(_, book):
    print(book['title'])
    return True

with open(r'C:\Users\u369811\books.xml', 'r') as f:
    FILE = f.read()
    OUTPUT = xmltodict.parse((FILE), item_depth=2, item_callback=handle)
    print(OUTPUT)
对于此xml

<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>
   <book id="bk102">
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-12-16</publish_date>
      <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description>
   </book>
   <book id="bk103">
      <author>Corets, Eva</author>
      <title>Maeve Ascendant</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-11-17</publish_date>
      <description>After the collapse of a nanotechnology 
      society in England, the young survivors lay the 
      foundation for a new society.</description>
   </book>
   <book id="bk104">
      <author>Corets, Eva</author>
      <title>Oberon's Legacy</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2001-03-10</publish_date>
      <description>In post-apocalypse England, the mysterious 
      agent known only as Oberon helps to create a new life 
      for the inhabitants of London. Sequel to Maeve 
      Ascendant.</description>
   </book>
   <book id="bk105">
      <author>Corets, Eva</author>
      <title>The Sundered Grail</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2001-09-10</publish_date>
      <description>The two daughters of Maeve, half-sisters, 
      battle one another for control of England. Sequel to 
      Oberon's Legacy.</description>
   </book>
   <book id="bk106">
      <author>Randall, Cynthia</author>
      <title>Lover Birds</title>
      <genre>Romance</genre>
      <price>4.95</price>
      <publish_date>2000-09-02</publish_date>
      <description>When Carla meets Paul at an ornithology 
      conference, tempers fly as feathers get ruffled.</description>
   </book>
   <book id="bk107">
      <author>Thurman, Paula</author>
      <title>Splish Splash</title>
      <genre>Romance</genre>
      <price>4.95</price>
      <publish_date>2000-11-02</publish_date>
      <description>A deep sea diver finds true love twenty 
      thousand leagues beneath the sea.</description>
   </book>
   <book id="bk108">
      <author>Knorr, Stefan</author>
      <title>Creepy Crawlies</title>
      <genre>Horror</genre>
      <price>4.95</price>
      <publish_date>2000-12-06</publish_date>
      <description>An anthology of horror stories about roaches,
      centipedes, scorpions  and other insects.</description>
   </book>
   <book id="bk109">
      <author>Kress, Peter</author>
      <title>Paradox Lost</title>
      <genre>Science Fiction</genre>
      <price>6.95</price>
      <publish_date>2000-11-02</publish_date>
      <description>After an inadvertant trip through a Heisenberg
      Uncertainty Device, James Salway discovers the problems 
      of being quantum.</description>
   </book>
   <book id="bk110">
      <author>O'Brien, Tim</author>
      <title>Microsoft .NET: The Programming Bible</title>
      <genre>Computer</genre>
      <price>36.95</price>
      <publish_date>2000-12-09</publish_date>
      <description>Microsoft's .NET initiative is explored in 
      detail in this deep programmer's reference.</description>
   </book>
   <book id="bk111">
      <author>O'Brien, Tim</author>
      <title>MSXML3: A Comprehensive Guide</title>
      <genre>Computer</genre>
      <price>36.95</price>
      <publish_date>2000-12-01</publish_date>
      <description>The Microsoft MSXML3 parser is covered in 
      detail, with attention to XML DOM interfaces, XSLT processing, 
      SAX and more.</description>
   </book>
   <book id="bk112">
      <author>Galos, Mike</author>
      <title>Visual Studio 7: A Comprehensive Guide</title>
      <genre>Computer</genre>
      <price>49.95</price>
      <publish_date>2001-04-16</publish_date>
      <description>Microsoft Visual Studio 7 is explored in depth,
      looking at how Visual Basic, Visual C++, C#, and ASP+ are 
      integrated into a comprehensive development 
      environment.</description>
   </book>
</catalog>

马修·甘巴德拉
XML开发人员指南
电脑类
44.95
2000-10-01
深入了解如何创建应用程序
使用XML。
拉尔斯,金
夜雨
幻想
5.95
2000-12-16
一位前建筑师与企业僵尸搏斗,
一个邪恶的女巫,和她自己的童年成为女王
世界的一部分。
科雷茨,伊娃
梅夫上升
幻想
5.95
2000-11-17
在纳米技术崩溃之后
在英国社会中,年轻的幸存者奠定了基础
建立新社会的基础。
科雷茨,伊娃
奥伯伦的遗产
幻想
5.95
2001-03-10
在后启示录时代的英格兰,神秘的
只被称为Oberon的代理帮助创造新的生命
为了伦敦的居民。梅夫续集
向上的
科雷茨,伊娃
破碎的圣杯
幻想
5.95
2001-09-10
梅芙的两个女儿,同父异母的姐妹,
为争夺英国的控制权而互相争斗。续集
奥伯伦的遗产。
兰德尔,辛西娅
情人鸟
浪漫
4.95
2000-09-02
当卡拉在鸟类学上遇到保罗时
在会议上,当羽毛被激怒时,脾气就会暴跳如雷。
瑟曼,保拉
水花四溅
浪漫
4.95
2000-11-02
一个深海潜水员二十岁就能找到真爱
海底千里。
克诺尔,斯特凡
令人毛骨悚然的爬虫
恐怖
4.95
2000-12-06
关于蟑螂的恐怖故事选集,
蜈蚣、蝎子和其他昆虫。
克雷斯,彼得
悖论丢失
科幻小说
6.95
2000-11-02
经过一次无意的海森堡之旅
不确定性装置,詹姆斯·萨尔韦发现了问题
是量子的。
蒂姆·奥布莱恩
微软.NET:编程圣经
电脑类
36.95
2000-12-09
微软的.NET计划在
详细信息请参阅本深度程序员参考资料。
蒂姆·奥布莱恩
MSXML3:综合指南
电脑类
36.95
2000-12-01
中介绍了Microsoft MSXML3解析器
详细信息,注意XML DOM接口、XSLT处理、,
萨克斯和更多。
加洛斯,迈克
VisualStudio7:综合指南
电脑类
49.95
2001-04-16
深入探索了Microsoft Visual Studio 7,
看看Visual Basic、Visual C++、C语言和ASP+
综合开发
环境
这可以很好地打印出所有的书,但是,这些书的标题是非类型的,我无法迭代输出或强制将它们放入列表中


如何使返回的输出成为字符串列表?

直接解析结果可能比使用回调更容易。e、 g

import xmltodict
with open(r'C:\Users\u369811\books.xml', 'r') as f:
    FILE = f.read()
    OUTPUT = xmltodict.parse(FILE)
    titles = [book['title'] for book in OUTPUT['catalog']['book']]
    for title in titles:
        print(title)
我的系统上的输出

XML Developer's Guide
Midnight Rain
Maeve Ascendant
Oberon's Legacy
The Sundered Grail
Lover Birds
Splish Splash
Creepy Crawlies
Paradox Lost
Microsoft .NET: The Programming Bible
MSXML3: A Comprehensive Guide
Visual Studio 7: A Comprehensive Guide

我在xmltodict上也有类似的问题,所以我修改了代码段,下面是我得到的:

#!/usr/bin/env python3
# -*- coding: utf8 -*-
import xml.etree.cElementTree as ElementTree


class Parser:

    def __init__(self, file):
        self.root = ElementTree.parse(file).getroot()

    class Dict(dict):

        def __init__(self, parent_element, **kwargs):
            super().__init__(**kwargs)
            if parent_element.items():
                self.update(dict(parent_element.items()))
            for element in parent_element:
                if element:
                    # treat like dict - we assume that if the first two tags
                    # in a series are different, then they are all different.
                    if len(element) == 1 or element[0].tag != element[1].tag:
                        item = Parser.Dict(element)
                    # treat like list - we assume that if the first two tags
                    # in a series are the same, then the rest are the same.
                    else:
                        # here, we put the list in dictionary; the key is the
                        # tag name the list elements all share in common, and
                        # the value is the list itself
                        item = {element[0].tag: Parser.List(element)}
                    # if the tag has attributes, add those to the dict
                    if element.items():
                        item.update(dict(element.items()))
                    self.update({element.tag: item})
                # this assumes that if you've got an attribute in a tag,
                # you won't be having any text. This may or may not be a
                # good idea -- time will tell. It works for the way we are
                # currently doing XML configuration files...
                elif element.items():
                    self.update({element.tag: dict(element.items())})
                # finally, if there are no child tags and no attributes, extract
                # the text
                else:
                    self.update({element.tag: element.text})

    class List(list):
        def __init__(self, item):
            super().__init__()
            for element in item:
                if element:
                    # treat like dict
                    if len(element) == 1 or element[0].tag != element[1].tag:
                        self.append(Parser.Dict(element))
                    # treat like list
                    elif element[0].tag == element[1].tag:
                        self.append(Parser.List(element))
                elif element.text:
                    text = element.text.strip()
                    if text:
                        self.append(text)
                elif element.items():
                    self.append(dict(element.items()))

    @property
    def parsed(self):
        if self.root.items():
            return Parser.Dict(self.root)
        else:
            return {self.root.tag: Parser.List(self.root)}

if __name__ == "__main__":
    import pprint
    pprint.pprint(Parser('PATH_TO_YOUR_XML.xml').parsed)
在您的示例中,输出为:

{'catalog': [{'author': 'Gambardella, Matthew',
              'description': 'An in-depth look at creating applications \n'
                             '      with XML.',
              'genre': 'Computer',
              'id': 'bk101',
              'price': '44.95',
              'publish_date': '2000-10-01',
              'title': "XML Developer's Guide"},
             {'author': 'Ralls, Kim',
              'description': 'A former architect battles corporate zombies, \n'
                             '      an evil sorceress, and her own childhood '
                             'to become queen \n'
                             '      of the world.',
              'genre': 'Fantasy',
              'id': 'bk102',
              'price': '5.95',
              'publish_date': '2000-12-16',
              'title': 'Midnight Rain'},
             {'author': 'Corets, Eva',
              'description': 'After the collapse of a nanotechnology \n'
                             '      society in England, the young survivors '
                             'lay the \n'
                             '      foundation for a new society.',
              'genre': 'Fantasy',
              'id': 'bk103',
              'price': '5.95',
              'publish_date': '2000-11-17',
              'title': 'Maeve Ascendant'},
             {'author': 'Corets, Eva',
              'description': 'In post-apocalypse England, the mysterious \n'
                             '      agent known only as Oberon helps to create '
                             'a new life \n'
                             '      for the inhabitants of London. Sequel to '
                             'Maeve \n'
                             '      Ascendant.',
              'genre': 'Fantasy',
              'id': 'bk104',
              'price': '5.95',
              'publish_date': '2001-03-10',
              'title': "Oberon's Legacy"},
             {'author': 'Corets, Eva',
              'description': 'The two daughters of Maeve, half-sisters, \n'
                             '      battle one another for control of England. '
                             'Sequel to \n'
                             "      Oberon's Legacy.",
              'genre': 'Fantasy',
              'id': 'bk105',
              'price': '5.95',
              'publish_date': '2001-09-10',
              'title': 'The Sundered Grail'},
             {'author': 'Randall, Cynthia',
              'description': 'When Carla meets Paul at an ornithology \n'
                             '      conference, tempers fly as feathers get '
                             'ruffled.',
              'genre': 'Romance',
              'id': 'bk106',
              'price': '4.95',
              'publish_date': '2000-09-02',
              'title': 'Lover Birds'},
             {'author': 'Thurman, Paula',
              'description': 'A deep sea diver finds true love twenty \n'
                             '      thousand leagues beneath the sea.',
              'genre': 'Romance',
              'id': 'bk107',
              'price': '4.95',
              'publish_date': '2000-11-02',
              'title': 'Splish Splash'},
             {'author': 'Knorr, Stefan',
              'description': 'An anthology of horror stories about roaches,\n'
                             '      centipedes, scorpions  and other insects.',
              'genre': 'Horror',
              'id': 'bk108',
              'price': '4.95',
              'publish_date': '2000-12-06',
              'title': 'Creepy Crawlies'},
             {'author': 'Kress, Peter',
              'description': 'After an inadvertant trip through a Heisenberg\n'
                             '      Uncertainty Device, James Salway discovers '
                             'the problems \n'
                             '      of being quantum.',
              'genre': 'Science Fiction',
              'id': 'bk109',
              'price': '6.95',
              'publish_date': '2000-11-02',
              'title': 'Paradox Lost'},
             {'author': "O'Brien, Tim",
              'description': "Microsoft's .NET initiative is explored in \n"
                             "      detail in this deep programmer's "
                             'reference.',
              'genre': 'Computer',
              'id': 'bk110',
              'price': '36.95',
              'publish_date': '2000-12-09',
              'title': 'Microsoft .NET: The Programming Bible'},
             {'author': "O'Brien, Tim",
              'description': 'The Microsoft MSXML3 parser is covered in \n'
                             '      detail, with attention to XML DOM '
                             'interfaces, XSLT processing, \n'
                             '      SAX and more.',
              'genre': 'Computer',
              'id': 'bk111',
              'price': '36.95',
              'publish_date': '2000-12-01',
              'title': 'MSXML3: A Comprehensive Guide'},
             {'author': 'Galos, Mike',
              'description': 'Microsoft Visual Studio 7 is explored in depth,\n'
                             '      looking at how Visual Basic, Visual C++, '
                             'C#, and ASP+ are \n'
                             '      integrated into a comprehensive '
                             'development \n'
                             '      environment.',
              'genre': 'Computer',
              'id': 'bk112',
              'price': '49.95',
              'publish_date': '2001-04-16',
              'title': 'Visual Studio 7: A Comprehensive Guide'}]}

我可以打印出这些项目,但是如果您尝试在代码中说list(title)来创建一个列表或对title执行任何其他操作,您将得到一个非类型错误。我提供的代码在打印它们之前创建了一个标题列表:
titles=[book['title']for book in OUTPUT['catalog']['book']
。您可以随意操纵该列表。e、 g.尝试
titles=[book['title'][::-1]对于输出中的book['catalog']['book']]
这是否应该建议xmldict作者停止输出为非类型?@sayth,嗯,实际上-我不知道:)我没有查看他的源代码,所以我不能对此发表任何意见