【问题标题】:How to use xmltodict to get items out of an xml file如何使用 xmltodict 从 xml 文件中获取项目
【发布时间】:2016-10-20 12:38:25
【问题描述】:

我正在尝试轻松访问 xml 文件中的值。

<artikelen>
    <artikel nummer="121">
        <code>ABC123</code>
        <naam>Highlight pen</naam>
        <voorraad>231</voorraad>
        <prijs>0.56</prijs>
    </artikel>
    <artikel nummer="123">
        <code>PQR678</code>
        <naam>Nietmachine</naam>
        <voorraad>587</voorraad>
        <prijs>9.99</prijs>
    </artikel>
..... etc

如果我想访问值 ABC123,我该如何获取它?

import xmltodict

with open('8_1.html') as fd:
    doc = xmltodict.parse(fd.read())
    print(doc[fd]['code'])

【问题讨论】:

    标签: python xml xmltodict


    【解决方案1】:

    使用您的示例:

    import xmltodict
    
    with open('artikelen.xml') as fd:
        doc = xmltodict.parse(fd.read())
    

    如果你检查doc,你会发现它是一个OrderedDict,按标签排序:

    >>> doc
    OrderedDict([('artikelen',
                  OrderedDict([('artikel',
                                [OrderedDict([('@nummer', '121'),
                                              ('code', 'ABC123'),
                                              ('naam', 'Highlight pen'),
                                              ('voorraad', '231'),
                                              ('prijs', '0.56')]),
                                 OrderedDict([('@nummer', '123'),
                                              ('code', 'PQR678'),
                                              ('naam', 'Nietmachine'),
                                              ('voorraad', '587'),
                                              ('prijs', '9.99')])])]))])
    

    根节点称为artikelen,还有一个子节点artikel,它是OrderedDict 对象的列表,所以如果您希望每篇文章都使用code,您可以这样做:

    codes = []
    for artikel in doc['artikelen']['artikel']:
        codes.append(artikel['code'])
    
    # >>> codes
    # ['ABC123', 'PQR678']
    

    如果您仅在nummer121 时才特别想要code,您可以这样做:

    code = None
    for artikel in doc['artikelen']['artikel']:
        if artikel['@nummer'] == '121':
            code = artikel['code']
            break
    

    也就是说,如果您正在解析 XML 文档并想要搜索这样的特定值,我会考虑使用 XPath expressionsElementTree 支持它。

    【讨论】:

      【解决方案2】:

      这是使用 xml.etree 你可以试试这个:

      for artikelobj in root.findall('artikel'):
          print artikelobj.find('code')
      

      如果你想根据artikel的“nummer”属性提取特定的代码,那么你可以试试这个:

      for artikelobj in root.findall('artikel'):
          if artikel.get('nummer') == 121:
              print artikelobj.find('code')
      

      这将只打印您想要的代码。

      【讨论】:

        【解决方案3】:

        您可以通过 XPath 表达式使用 lxml 包。

        from lxml import etree
        f = open("8_1.html", "r")
        tree = etree.parse(f)
        expression = "/artikelen/artikel[1]/code"
        l = tree.xpath(expression)
        code = next(i.text for i in l)
        print code
        
        # ABC123
        

        这里要注意的是表达式。 /artikelen 是根元素。 /artikel[1] 选择root 下的第一个artikel 元素(注意第一个元素不在索引0 处)。 /codeartikel[1] 下的子元素。您可以在lxmlxpath syntax 阅读更多信息。

        【讨论】:

          【解决方案4】:

          读取 .xml 文件:

          import lxml.etree as ET
          root = ET.parse(filename).getroot()
          value = root.node1.node2.variable_name.text
          

          【讨论】:

          • 在你的例子中:result = root.artikel.code.text
          • 导入不正确,因为python报错
          • 错误信息是什么?你安装 lxml 包了吗?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多