3

私はxmlパーサーに取り組んでいます。目標は、接頭辞とタグが一貫したままで、名前空間が変更されている多数の異なる xml ファイルを解析することです。

したがって、私は次のいずれかを試しています:

  • <prefix:tags>プレフィックスを名前空間で解決(置換)せずにxmlを解析するだけです。プレフィックスは、ドキュメントごとに変更されません。
  • 名前空間を自動的にロードして、識別子 ( <prefix:tag>) を適切な名前空間に置き換えることができるようにします。
  • タグでxmlを解析するだけです

で試しましたxml.etree.ElementTree

また、私を助けることができる lxmlのXMLParserlxml の構成オプションが見つかりませんでしたが、ここで著者が名前空間を自動的に収集できるはずだと提案している回答を読むことができました。lxml

興味深いことに、parsed_file = etree.XML(file)次のエラーで失敗します。

lxml.etree.XMLSyntaxError: Start tag expected, '<' not found, line 1, column 1

解析したいファイルの一例はこちら

4

2 に答える 2

2

ns プレフィックスを気にせず、完全な名前空間を気にする

時々、人々はこれらの短い接頭辞を気にし、忘れてしまいます.2番目に重要です. これらは、完全修飾名前空間への短い参照にすぎません。例えば

xmlns:trw="http://www.trw.com/20131231"

in xml は、これからは"trw:"完全修飾名前空間 の略です"http://www.trw.com/20131231"。このプレフィックスは、後続の要素の他の名前空間に再定義でき、まったく異なる意味になる可能性があることに注意してください。

一方、本当の意味、つまりここでの完全修飾名前空間の意味に関心がある場合は、 と考えることができ"trw:row"ます"{http://www.trw.com/20131231}row"。この翻訳された意味は信頼性が高く、接頭辞が変更されても変わりません。

参照された xml の解析

http://edgar.sec.gov/Archives/edgar/data/1267097/000104746914000925/trw-20131231.xmlへのリンクは xml につながり、これによって検証されxmlstarletlxml解析できます。

表示されるエラー メッセージはストリームの最初の文字を参照しているため、ファイル内の BOM バイトに遭遇したか、gzip されて最初に解凍される xml を読み込もうとしている可能性があります。

lxml と名前空間

lxml名前空間でうまく機能します。名前空間を使用する XPath 式を使用できます。xmlns出力で名前空間プレフィックスを制御すると、シリアル化されたドキュメントの一部である属性に依存するため、もう少し複雑になります。プレフィックスを変更したい場合は、これらのxmlns属性を整理する必要があります。多くの場合、すべてをルート要素に移動します。同時に、lxml各要素の完全修飾名前空間を追跡するため、シリアル化の時点で、この名前空間の現在有効なプレフィックスだけでなく、この完全な名前も尊重されます。

これらのxmlna属性を処理するには、もう少しコードが必要ですlxml。ドキュメントを参照してください。

于 2014-05-15T20:43:18.787 に答える
1
items = tree.xpath("*[local-name(.) = 'a_tag_goes_here']")

仕事をした。その上、生成されたリストitemsを手動で参照して、他の必要なフィルタリング関数を定義する必要がありました。

于 2014-05-16T12:28:10.760 に答える