5

要素へのXPathを動的に構築することにより、ATOMxmlのサブツリーで要素を検索する動的関数を作成する必要があります。

そうするために、私はこのようなものを書きました:

    tree = etree.parse(xmlFileUrl)
    e = etree.XPathEvaluator(tree, namespaces={'def':'http://www.w3.org/2005/Atom'})
    entries = e('//def:entry')
    for entry in entries:
        mypath = tree.getpath(entry) + "/category"
        category = e(mypath)

上記のコードは、getpath()が名前空間のないXPathを返すのに対し、XPathEvaluator e()は名前空間を必要とするため、「カテゴリ」を見つけることができません。

XPathEvaluatorの呼び出しでパスを使用して名前空間を指定できることはわかっていますが、すべての名前空間を使用してgetpath()に「完全修飾」パスを返すことができるかどうかを知りたいのですが、これは特定の場合に便利です。ケース。

(これは私の以前の質問のスピンオフ質問です:名前空間のないPython XpathEvaluator

4

3 に答える 3

2

ドキュメントからhttp://lxml.de/xpathxslt.html#the-xpath-class

ElementTreeオブジェクトには、getpath(element)その要素を見つけるための構造的な絶対XPath式を返すメソッドがあります。

したがって、あなたの質問に対する答えはgetpath()、「完全修飾」パスを返さないということです。そうしないと、その関数に対する引数が存在するため、返されたxpath式がその要素を見つけることが保証されるだけです。

getpathとxpath(およびXpathクラス)を組み合わせて、やりたいことを実行できる場合があります。

于 2012-10-30T12:55:00.750 に答える
2

ルートからフル パスを構築しようとするのではなく、エントリをベース ノードとして XPath 式を評価できます。

tree = etree.parse(xmlFileUrl)
nsmap = {'def':'http://www.w3.org/2005/Atom'}
entries_expr = etree.XPath('//def:entry', namespaces=nsmap)
category_expr = etree.XPath('category')
for entry in entries_expr(tree):
    category = category_expr(entry)

.xpath()パフォーマンスが重要でない場合は、コンパイル済みの式ではなく、要素に対してメソッドを使用してコードを簡素化できます。

tree = etree.parse(xmlFileUrl)
nsmap = {'def':'http://www.w3.org/2005/Atom'}
for entry in tree.xpath('//def:entry', namespaces=nsmap):
    category = entry.xpath('category')
于 2012-11-24T15:03:43.737 に答える