2

デフォルトの名前空間を使用して XML ドキュメントを解析しようとしています。つまり、ルート ノードにxmlns属性があります。各タグにはデフォルトの名前空間がプレフィックスとして付けられているため、子ノードで特定のタグを見つけようとする場合、これは面倒です。

xml.etree.ElementTree.findall()辞書を渡すことができnamespacesますが、デフォルトの名前空間がマップされているものを見つけることができないようです。「デフォルト」、「なし」、「xmlns」を使用してみましたが、成功しませんでした。

機能しているように見える1つのオプションは、渡されたタグfindall()に「xmlns:」(編集:これは実際には任意の一意の名前にすることができます)と名前空間辞書の対応するエントリをプレフィックスとして付けることですが、それが必要かどうか疑問に思っています.

編集: これは Python 3.3.2 であることに注意してください。私は古いバージョンの Python を信じており、引数findall()を受け入れません。namespaces

4

1 に答える 1

2

メソッドのソース コードを確認することにしました。結局のところ、xml.etree.ElementPath 内の次のコードは汚い仕事をしています:

def xpath_tokenizer(pattern, namespaces=None):
    for token in xpath_tokenizer_re.findall(pattern):
        tag = token[1]
        if tag and tag[0] != "{" and ":" in tag:
            try:
                prefix, uri = tag.split(":", 1)
                if not namespaces:
                    raise KeyError
                yield token[0], "{%s}%s" % (namespaces[prefix], uri)
            except KeyError:
                raise SyntaxError("prefix %r not found in prefix map" % prefix)
        else:
            yield token

patternに渡されるタグfindall()です。タグに何も見つからない場合:、トークナイザーは置換なしで単純にタグを返します。

于 2013-08-11T12:49:37.343 に答える