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あるサブノードがあるため、記事ごとに必要な場合は次のようにします。artikelOrderedDictcode

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

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

codeis の場合のみが特に必要な場合nummer121、次のようにすることができます。

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 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]選択します(最初の要素はインデックス 0 ではないことに注意してください)。の下の子要素です。lxmlおよびxpath 構文について詳しく読むことができます。artikelroot/codeartikel[1]

于 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 に答える