24

私は Python が好きですが、要素から属性を取得するためだけに 10 行も書きたくありません。私だけかもしれませんが、そうでminidomはありませんmini。それを使用して何かを解析するために書かなければならないコードは、Java コードによく似ています。

もっとあるものはありますuser-friendlyか?オーバーロードされた演算子を持つもの、および要素をオブジェクトにマップするものは?

これにアクセスできるようにしたい:


<root>
<node value="30">text</node>
</root>

このようなものとして:


obj = parse(xml_string)
print obj.node.value

getChildrenまたはそのような他の方法を使用しないでください。

4

4 に答える 4

21

ElementTreeを見てください。それはあなたが望むことを正確に行っているわけではありませんが、minidom よりもはるかに優れています。私の記憶が正しければ、python 2.4 以降、標準ライブラリに含まれています。より高速にするには、cElementTree を使用します。より高速 (およびより多くの機能) を得るには、lxmlを使用できます(ニーズ/アプローチについては objectify API を確認してください)。

BeautifulSoupは部分的にあなたが望むことを行うことを付け加えておきます。このアプローチを採用しているAmaraもあります。

于 2009-09-29T17:35:42.353 に答える
3

私は実際にあなたが想像した通りに物事を行うライブラリを書きました。ライブラリは「xe」と呼ばれ、次の場所から入手できます。http://home.avvanta.com/~steveha/xe.html

xeはXMLをインポートして、オブジェクト指向の方法でデータを操作できるようにすることができます。実際にはxml.dom.minidomを使用して解析を実行しますが、結果のツリーをウォークオーバーし、データをxeオブジェクトにパックします。

編集:さて、私は先に進んであなたの例をxeに実装したので、それがどのように機能するかを見ることができます。示したXMLを実装するためのクラスは次のとおりです。

import xe

class Node(xe.TextElement):
    def __init__(self, text="", value=None):
        xe.TextElement.__init__(self, "node", text)
        if value is not None:
            self.attrs["value"] = value

class Root(xe.NestElement):
    def __init__(self):
        xe.NestElement.__init__(self, "root")
        self.node = Node()

そして、これが上記の使用例です。サンプルXMLを「example.xml」というファイルに入れましたが、それを文字列に入れて文字列を渡すこともできます。

>>> root = Root()
>>> print root
<root/>
>>> root.import_xml("example.xml")
<Root object at 0xb7e0c52c>
>>> print root
<root>
    <node value="30">text</node>
</root>
>>> print root.node.attrs["value"]
30
>>>

この例では、「値」のタイプは文字列になることに注意してください。別のタイプの属性が本当に必要な場合は、少しの作業でそれも可能ですが、この例では気にしませんでした。(PyFeedを見ると、テキストではない属性を持つOPMLのクラスがあります。)

于 2009-09-29T18:32:14.877 に答える
2

私は単純な xml パーサーを同じように必要としており、さまざまなライブラリのチェックに長い時間を費やした後、xmltrampを見つけました。

あなたの例のxmlに基づいて:

import xmltramp

xml_string = """<root>
<node value="30">text</node>
</root>"""

obj = xmltramp.parse(xml_string)
print obj.node('value')             # 30
print str(obj.node)                 # text

より使いやすいものは見つかりませんでした。

于 2012-10-05T09:33:23.773 に答える