0

私は動作する次のコードを持っています:

import xml.etree.ElementTree as etree


def get_path(self):
    parent =  ''
    path = self.tag
    sibs = self.parent.findall(self.tag)
    if len(sibs) > 1:
        path = path + '[%s]'%(sibs.index(self)+1)
    current_node = self
    while True:
        parent = current_node.parent
        if not parent:
            break
        ptag = parent.tag
        path = ptag + '/' + path
        current_node = parent
    return path

etree._Element.get_path = get_path
etree._Element.parent = None

class XmlDoc(object):
    def __init__(self):
        self.root = etree.Element('root')
        self.doc = etree.ElementTree(self.root)

    def SubElement(self, parent, tag):
        new_node = etree.SubElement(parent, tag)
        new_node.parent = parent
        return new_node

doc = XmlDoc()
a1 = doc.SubElement(doc.root, 'a')
a2 = doc.SubElement(doc.root, 'a')
b = doc.SubElement(a2, 'b')
print etree.tostring(doc.root), '\n'
print 'element:'.ljust(15), a1
print 'path:'.ljust(15), a1.get_path()
print 'parent:'.ljust(15), a1.parent, '\n'
print 'element:'.ljust(15), a2
print 'path:'.ljust(15), a2.get_path()
print 'parent:'.ljust(15), a2.parent, '\n'
print 'element:'.ljust(15), b
print 'path:'.ljust(15), b.get_path()
print 'parent:'.ljust(15), b.parent

この出力は次のようになります。

<root><a /><a><b /></a></root> 

element:        <Element a at 87e3d6c>
path:           root/a[1]
parent:         <Element root at 87e3cec> 

element:        <Element a at 87e3fac>
path:           root/a[2]
parent:         <Element root at 87e3cec> 

element:        <Element b at 87e758c>
path:           root/a/b
parent:         <Element a at 87e3fac>

現在、これは元のコードから大幅に変更されていますが、それを共有することはできません。

関数はそれほど非効率的ではありませんが、cElementTree から ElementTree に切り替えるとパフォーマンスが大幅に低下することが予想されましたが、私の実験では、cElementTree のモンキー パッチは不可能のようで、切り替える必要がありました。

私が知る必要があるのは、cElementTree にメソッドを追加する方法があるかどうか、またはこれを行うためのより効率的な方法があるかどうかで、パフォーマンスの一部を取り戻すことができます。

最後の手段として、選択した静的型付けを実装し、cython でコンパイルすることを考えていることをお知らせしますが、特定の理由により、実際にはそうしたくありません。

ご覧いただきありがとうございます。

編集: 遅延バインディングという用語の間違った使用について申し訳ありません。ときどき、私の語彙力が足りないものを残すことがあります。私が言いたかったのは「モンキーパッチ」です。

EDIT:@Corley Brigman、Guy:質問に対処する回答をありがとうございます(そして、元の投稿でこれを述べるべきでした)コーディングを作成する素晴らしいライブラリであるlxmlを使用する前に、このプロジェクトを完了しました簡単ですが、新しい要件 (これは Splunk と呼ばれる製品へのアドオンとして実装する必要があります) により、Splunk に同梱されている python 2.7 インタープリターに結び付けられ、django を除いてサードパーティのライブラリを追加する可能性が排除されます。

4

2 に答える 2