2

ちょっと注意してください、私は次のようにインポートされた lxml を使用しています: from lxml import etree.

いくつかの作業コードをより柔軟にしようとしています。私のスクリプトは、名前順にすべての項目を含む入力 .xml ファイルを受け取り、項目 ID 番号と項目名を含むディクショナリを参照して、その .xml ファイルに基づいて項目 ID のリストを生成し、Web サーバーをポーリングします。総コストを出力するために使用するアイテム ID の価格データ。私の質問は、これらの手順に関するものではありません。

むしろ、私の質問は、複数の注文を含む .xml ファイルの解析を処理する方法についてです。

これまでのところ、私のサンプル .xml ファイルは次のようになります。

<?xml version="1.0" ?>
    <cars>
        <order="This is a test order">
            <description value=""/>
            <carType value="Model1"/>
            <upgrade slot="interior 0" type="Leather Seats"/>
            <upgrade slot="interior 1" type="6-Disc CD Player"/>
        </order>
    </cars>

これを解析して、ベース アイテム carType (車のモデル) とさまざまなアップグレードの両方を含むリストを作成できます。

for element in root.iterchildren('carType'):
    modlist.append ("%s" % (element.get('value')))

for element in root.iter('upgrade'):
    modlist.append ("%s" % str.upper((element.get('type'))))

modlistlikeという名前のリストが表示され['Model1', 'Leather Seats', '6-Disc CD Player']、他の関数を実行してそれらのアイテムの ID 番号を取得し、そこから価格情報を取得して合計すると、この Model1 のレザー シート アップグレード付きの車がいくらになるかがわかります。 6 ディスク CD プレーヤーのアップグレードには費用がかかります。

ここで私は困難にぶつかります。1 つの .xml ファイルに複数の車を含めるにはどうすればよいですか? 例は次のようになります。

<?xml version="1.0" ?>
    <cars>
        <order="This is a test order">
            <description value=""/>
            <carType value="Model1"/>
            <upgrade slot="interior 0" type="Leather Seats"/>
            <upgrade slot="interior 1" type="6-Disc CD Player"/>
        </order>
        <order="This is a 2nd order">
            <description value=""/>
            <carType value="Model3"/>
            <upgrade slot="interior 0" type="Vinyl Seats"/>
            <upgrade slot="wheels 0" type="Chrome Wheels"/>
            <upgrade slot="wheels 1" type="8 Ply Tires"/>
        </order>
        <order="This is a 3rd order">
            <description value=""/>
            <carType value="Model7"/>
            <upgrade slot="engine 0" type="V8"/>
            <upgrade slot="interior 0" type="Leather Seats"/>
            <upgrade slot="interior 1" type="Sunroof"/>
        </order>
    </cars>

一度に 1 つの注文で関数を実行して、この例が 3 つの数値を出力するようにしたいと考えています。このモデル 1 車のアップグレード付きの総合計価格、モデル 3 車のアップグレード付きの合計価格、および合計価格です。アップグレードされたModel7車の。

一度に 1 つの注文だけを実行するように関数を指定するにはどうすればよいですか? いろいろ考えているのですiterchild()が、どうしようもありません。

4

1 に答える 1

1

を呼び出す代わりに、要素を反復処理する をroot.iterchildren使用します。order.iterchildrenorder<order>

for order in root.xpath('//order'):
    modlist = []
    for element in order.iterchildren('carType'):
        modlist.append ("%s" % (element.get('value')))

    for element in order.iter('upgrade'):
        modlist.append ("%s" % str.upper((element.get('type'))))
    # report grand total for order
于 2012-10-01T01:04:19.387 に答える