私は動作する次のコードを持っています:
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 を除いてサードパーティのライブラリを追加する可能性が排除されます。