7

私のXMLは次のようになります。

...
<termEntry id="c1">
    <langSet xml:lang="de">
    ...

そして私はコードを持っています:

from lxml import etree
...

for term_entry in root.iterfind('.//termEntry'):
    print term_entry.attrib['id']
    print term_entry.nsmap

    for lang_set in term_entry.iterfind('langSet'):
        print lang_set.nsmap
        print lang_set.attrib

        for some_stuff in lang_set.iterfind('some_stuff'):
            ...

空のnsmapdictを取得し、attribdictは次のようになります。{'{http://www.w3.org/XML/1998/namespace}lang': 'en'}

ファイルが名前空間に含まxml:れていないか、別の名前空間を持っている可能性があります。タグ宣言で使用されている名前空間を知るにはどうすればよいですか?実際、属性を取得するだけで、langどの名前空間が使用されたかは関係ありません。lang_set.attrib.values()[0]既知の名前のフィールドのようなくだらないゴミや他のルックアップを使用したくありません。

4

2 に答える 2

6

あなたは単にxpathを使うことができます:

lang_set.xpath('./@xml:lang')[0]

ところで、TBX ファイルを扱っていますか?

于 2016-12-28T01:25:48.283 に答える
6

属性を取得するだけlangで、どの名前空間が使用されたかは気にしません

あなたの質問はあまり明確ではなく、完全な実行可能なコード例を提供していません。ただし、コメントで @mmgp によって提案されているように、文字列操作を行うだけで十分な場合があります。

ただし、xml:langと同じではありませんrandom_prefix:lang(または単にlang)。名前空間を気にする必要があると思います。目的が要素のコンテンツに適用される自然言語を識別することである場合は、使用する必要がありますxml:lang(これがこの属性の明示的な目的であるためです。http://www.w3.org/TR/REC-xml/#を参照してください)。秒言語タグ)。


{http://www.w3.org/XML/1998/namespace}attributesの文字列がどこに保存されているか知りたいだけです

xmlプレフィックスが特別であることを知っておくことが重要です。これは予約されており (任意であると想定されている他のほとんどすべての名前空間プレフィックスとは対照的に)、 にバインドされるように定義されていますhttp://www.w3.org/XML/1998/namespace

Namespaces in XML 1.0 W3C 勧告から:

プレフィックスxmlは、定義により名前空間 name にバインドされていますhttp://www.w3.org/XML/1998/namespace。宣言する必要はありませんが、宣言する必要はなく、他の名前空間名にバインドしてはなりません。他のプレフィックスをこの名前空間名にバインドしてはならず、デフォルトの名前空間として宣言してはなりません。

xml接頭辞のその他の用途は、xml:spaceおよびxml:base属性です。


lxml が名前空間処理のためのメソッドを提供しない場合、それは本当に奇妙です

lxml は名前空間を適切に処理しますが、プレフィックスは可能な限り回避します。プレフィックスhttp://www.w3.org/XML/1998/namespaceを含むルックアップを行うときは、名前空間名を使用する必要があります。xml

于 2012-12-15T14:07:46.953 に答える