How to use xmltodict to get items out of an xml file

时间:2016-10-20 12:38:25

标签: python xml xmltodict

I am trying to easily access values from an xml file.

<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

If i want to acces the value ABC123, how do I get it?

import xmltodict

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

4 个答案:

答案 0 :(得分:14)

使用您的示例:

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,子节点artikelOrderedDict个对象的列表,因此,如果您希望每篇文章都有code,那么会这样做:

codes = []
for artikel in doc['artikelen']['artikel']:
    codes.append(artikel['code'])

# >>> codes
# ['ABC123', 'PQR678']

如果您只在codenummer时特别想要121,那么您可以这样做:

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

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

答案 1 :(得分:0)

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

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

如果您想根据属性&#39; nummer&#39;提取特定代码。 artikel,然后你可以试试这个:

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

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

答案 2 :(得分:-1)

To read .xml files :

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

答案 3 :(得分:-2)

您可以使用XPath Expression使用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]选择artikel下的第一个root元素(注意第一个元素不在索引0处)。 /codeartikel[1]下的子元素。您可以在lxmlxpath syntax了解更多信息。