2017-04-18 11 views
0

を解析:Pythonの - 私は次のような構造を持つファイルを処理しようとしている複数のXMLパーツを含むファイル

<?xml version="1.0" encoding="ISO-8859-1" ?> 
    <!DOCTYPE doc SYSTEM "djnml-1.0b.dtd"> 
    <doc msize="000007622" md5="235d6d9aa0071dd0bd711e812ff918fc" sysId="sbknwsarchp01" destination="AW" distId=" " transmission-date="    " > 
    <djnml publisher="DJN" docdate="20160301" product="DN" seq="4" xml:lang="en-us" > 
    <head> 
    <copyright year="2016" holder="text" ></copyright> 
    <docdata> 
    <djn> 
    <djn-newswires news-source="DJDN" origin="DJ" service-id="CO" > 
    <djn-press-cutout/> 
    <djn-urgency>0</djn-urgency> 
    <djn-mdata brand="DJ" temp-perm="P" retention="N" hot="N" original-source="DJCS" accession-number="20160301000004" page-citation="" display-date="20160301T050006.315Z" > 
    <djn-coding> 
    <djn-government> 
    <c>G/AGD</c> 
    <c>G/USG</c> 
    </djn-government> 
    <djn-page> 
    <c>70180</c> 
    <c>83567</c> 
    </djn-page> 
    <djn-subject> 
    <c>N/DJAG</c> 
    <c>N/DJCS</c> 
    </djn-subject> 
    <djn-market> 
    <c>M/MMR</c> 
    </djn-market> 
    <djn-product> 
    <c>P/ACMD</c> 
    <c>P/FNVW</c> 
    </djn-product> 
    <djn-geo> 
    <c>R/NME</c> 
    <c>R/TN</c> 
    </djn-geo> 
    </djn-coding> 
    </djn-mdata> 
    </djn-newswires> 
    </djn> 
    </docdata> 
    </head> 
    <body> 
    <headline brand-display="DJ" > 
    text</headline> 
    <text> 
    <pre> 
    text 
    </pre> 
    <p> 
     text</p> 
    <p> 
     text</p> 
    </text> 
    </body> 
    </djnml> 
    </doc> 
<?xml version="1.0" encoding="iso-8859-1" ?> 
<!DOCTYPE doc SYSTEM "djnml-1.0b.dtd"> 
<doc msize="000002698" md5="81b0dd0339b8c77febf46ebdaf8ef617" sysId="sbknwsarchp01" destination="AW" distId=" " transmission-date="    " > 
<djnml publisher="DJN" docdate="20160301" product="DN" seq="70" xml:lang="en-us" > 
<head> 
<copyright year="2016" holder="text" ></copyright> 
<docdata> 
<djn> 
<djn-newswires news-source="DJDN" origin="DJ" service-id="CO" > 
<djn-press-cutout/> 
<djn-urgency>0</djn-urgency> 
<djn-mdata brand="DJ" temp-perm="P" retention="N" hot="N" original-source="FW" accession-number="20160301000070" page-citation="" display-date="20160301T052632.174Z" > 
<djn-coding> 
<djn-company> 
<c>ANZ.AU</c> 
<c>ANZ.NZ</c> 
<c>ANZBY</c> 
</djn-company> 
<djn-isin> 
<c>AU000000ANZ3</c> 
<c>US0525283042</c> 
</djn-isin> 
<djn-industry> 
<c>I/BAN</c> 
<c>I/BKS</c> 
</djn-industry> 
<djn-page> 
<c>22767</c> 
<c>5014</c> 
<c>55115</c> 
</djn-page> 
<djn-subject> 
<c>N/AER</c> 
<c>N/BKG</c> 
</djn-subject> 
<djn-market> 
<c>M/FCL</c> 
<c>M/NND</c> 
</djn-market> 
<djn-product> 
<c>P/ABO</c> 
<c>P/AEI</c> 
</djn-product> 
<djn-geo> 
<c>R/ASA</c> 
<c>R/FE</c> 
</djn-geo> 
</djn-coding> 
</djn-mdata> 
</djn-newswires> 
</djn> 
</docdata> 
</head> 
<body> 
<headline brand-display="DJ" > 
text</headline> 
<text> 
<pre> 
</pre> 
<p> 
    text </p> 
<pre> 

Editor JSM 

</pre> 
<p> 
    text</p> 
<p> 
    text</p> 
</text> 
</body> 
</djnml> 
</doc> 

すなわち、ファイルには多くの小さな "xml"パーツが含まれています。エラー

File "<string>", line unknown 
ParseError: junk after document element: line 195, column 0 

私はこのエラーを取り除くことができますどのように任意のアイデアを提供します

import xml.etree.ElementTree as ET 
tree = ET.parse('test.nml') 
root = tree.getroot() 
print(root.iter('djn-subject')) 
for element_1 in root.iter('djn-subject'): 
    for element_2 in root.iter('c'): 
     print(element_2.text) 

私は、次のコードをしようとしていますか?私のXMLファイルには複数のルーツがあるようですが、この問題に対処するためにルートや別の方法ですべてを包み込む方法がありますか?ありがとうございました。

+0

xmlの開始タグに基づいてファイルを分割してみましたか?最初のセットを読むだけで簡単にできるはずですが、戻って残りのものを手に入れましょう。 – Chris

+0

複数のXML文書を1つのファイルから分割するために 'ElementTree'を使用する関数については、[前の解答](http://stackoverflow.com/a/41176663/8747)を参照してください。 –

+1

*私のXMLファイルは複数のルーツを持つようです。* ... W3C標準では、このマークアップはXMLファイルではありません。定義上、XMLは整形式であり、従ってPythonの 'etree' *のような準拠ライブラリは間違っていなければなりません。このマークアップのソースをソフトウェア、ベンダー、またはプログラマーとして探し、開発作業を続ける前にこの問題を修正してください。 – Parfait

答えて

0

XML etreeは、単一のルートノードしか想定していません。あなたが複数のルーツを持っているなら、それを解析するつもりはなく、見た目のようなエラーが出るでしょう。取得しようとしているすべての要素が単一のルートノードの下にあるようにXMLファイルを編集する必要があります。または、各ルートノードを複数のファイルに分割して個別に解析する必要があります(これは、名前空間とxsdが同じか違うかによって異なります)。

関連する問題