16

我正在尝试轻松访问 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'])
4

4 回答 4

28

使用您的示例:

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']

如果你特别想要codeonly when nummeris 121,你可以这样做:

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

也就是说,如果您正在解析 XML 文档并想要搜索这样的特定值,我会考虑使用XPath 表达式,它受ElementTree.

于 2016-10-20T14:51:34.367 回答
-1

这是使用 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')

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

于 2016-10-20T14:51:34.060 回答
-2

您可以使用 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]选择artikel下的第一个元素root(注意第一个元素不在索引 0 处)。/code是 下的子元素artikel[1]。您可以阅读更多关于lxmlxpath 语法的信息。

于 2016-10-20T15:35:17.527 回答
-3

要读取 .xml 文件:

import lxml.etree as ET
root = ET.parse(filename).getroot()
value = root.node1.node2.variable_name.text
于 2016-10-20T12:43:07.257 回答