3

私は Python を初めて使用し、XML 解析の作業を始めたばかりです。XML を操作するためのすべてのオプションに少し圧倒されています。私が取り組んでいる単純な問題について、経験豊富な人がアドバイス (およびおそらくコード サンプル??) を与えてくれることを願っています。

データベースを使用しない単純な Python 連絡先管理アプリケーションに取り組んでいます。各連絡先の情報は、XML を使用して個別のテキスト ファイルに保存されます。たとえば、ファイル「1234.xml」の内容が次のとおりであるとします。

<contact>
<id>1234</id>
<name>Johnny Appleseed</name>
<phone>8145551212</phone>
<address>
    <street>1234 Main Street</street>
    <city>Hometown</city>
    <state>OH</state>
</address>
<address>
    <street>1313 Mockingbird Lane</street>
    <city>White Plains</city>
    <state>NY</state>
</address>
</contact>

例として、電話番号は 1 つしかなく、アドレス ブロックは複数あるとします。

ここで行っていることは、ファイルから XML を解析し、データに変更を加えてから、XML を更新してファイルに保存できるようにする必要があります。次の 3 種類のデータ変更が発生する可能性があるとします。

  1. 電話番号の更新など、1 つ以上のアイテムのデータを変更する

  2. 新しい住所ブロック (および新しい住所の通り/都市/州の対応するデータ) の追加

  3. 既存のアドレス ブロックの削除

私がここでやろうとしていることを考えると、これを行う特定の方法をお勧めできますか? (SAX、DOM、minidom、ElementTree、その他の何か?)あなたが提案するコードサンプルは大歓迎です。

ありがとうございました!

ロン

4

2 に答える 2

2

SAX および DOM API は古いものです。Java の世界から Python にほぼ翻訳されました。ElementTree API は特に Pythonic になるように設計されています。つまり、問題を解決する Python の方法に適合するように設計されているため、それをお勧めします。

私が知っている ElementTree の最もリッチで高速な実装はlxmlです。その XPath 機能は非常に便利です。テストされていない例:

from lxml import etree

contacts = etree.parse(open("1234.xml"))

for c in contacts.xpath('//contact'):
    if c.xpath('/name')[0].text == 'Johnny Appleseed':
        c.xpath('/phone')[0].text = NEW_PHONE_NUMBER

print >> open("1234.xml", "w"), etree.tostring(contacts)
于 2011-06-22T18:12:41.890 に答える
2

最善の解決策は、ElementTreeこれを使用して一連のクラスに解析し、クラスを操作してから、シリアル化して XML に戻すことです。XML がサンプルと同じくらい単純な場合、または何らかのツールまたはライブラリを使用してバインディングを生成できる場合は、手動でこれを行うことができます。

ほとんどの場合、XML を直接操作することは、常に失敗に終わるか、少なくとも髪を引っ張ることになります。また、XML が変更されると、通常、手動でコーディングされた解析が中断されます。

バインド ソリューションを使用すると、変更に対してより堅牢になり、手動で介入する必要がある場合に簡単に変更できます。

于 2011-06-22T18:03:15.237 に答える