2017-07-28 16 views
0

私はPythonのelemenTreeを使用してXMLファイルを解析しようとしています。Python ElementTreeがxmlファイルを正しく解析できません

<App xmlns="test attribute"> 
    <name>sagar</name> 
</App> 

パーサコード: xmlファイルは、以下のようなものです

from xml.etree.ElementTree import ElementTree 
from xml.etree.ElementTree import Element 
import xml.etree.ElementTree as etree 
def parser(): 
    eleTree = etree.parse('app.xml') 
    eleRoot = eleTree.getroot() 
    print("Tag:"+str(eleRoot.tag)+"\nAttrib:"+str(eleRoot.attrib)) 
if __name__ == "__main__": 
    parser() 

出力:

[[email protected] Parser]$ python test.py 
Tag:{test attribute}App <------------- It should print only "App" 
Attrib:{} 

私は "のxmlns" 属性を削除するか、他の何かに "のxmlns" 属性の名前を変更するとeleRoot.tagが正しい値を出力しています。 タグに "xmlns"属性があると、要素ツリーがタグを正しく解析できないのはなぜですか?要素ツリーを使用してこの形式のXMLを解析するためのいくつかの前提条件がありませんか?

+0

私はそれはタグがから来ている名前空間を定義しているので、 'xmlns'属性は、特別な処理を取得することを推測すると思います。 – Blckknght

+0

@Blckknght私のコードを動作させるために必要な特別な処理は何ですか? – sagar

+0

問題はあなたのコードではなく、XMLです。私がちょうど[ここ](http://effbot.org/zone/element-namespaces.htm#element-tree-representation)で見つけた小さな落とし穴は、要素に定義されているxml名前空間がある場合、それが修飾された名前は "{ namespace_url}タグ」を参照してください。したがって、あなたの例では、 "test属性"のデフォルト名前空間を定義しています。つまり、 'App'要素の完全修飾名は実際には" {test attribute} App "です。私はこの情報に対応するために私の答えを変更する予定です。 –

答えて

2

xmlはデフォルトのxml名前空間を定義しようとしている属性xmlnsを使用しています。 Xmlネームスペースはネーミングの競合を解決するために使用され、その値には有効なURIが必要です。"test attribute"の値は無効です。xmlの解析にはetreeが発生しているようです。

xml名前空間の詳細については、W3学校のXML Namespacesを参照してください。


編集:

さらに問題に見た後、要素の完全修飾名は、PythonのElementTreeを使用して、フォーム{namespace_url}tag_nameを持っているときに表示されます。これは、 "テスト属性"のデフォルトの名前空間を定義したときに、 "アプリケーション"タグの完全修飾名がinfactであることを意味します。{test attribute}App、これはプログラムから抜け出したものです。

Source

関連する問題