2017-12-06 3 views
0

に変換するには、XMLを解析私はこのようなxmlファイルを持っている:は、ヘッダーをスキップし、JSON

"HTTP/1.1 100 Continue 
    HTTP/1.1 200 OK 
    Expires: 0 
    Buffer: false 
    Pragma: No-cache 
    Cache-Control: no-cache 
    Server: Transaction_Server/4.1.0(zOS) 
    Connection: close 
    Content-Type: text/html 
    Content-Length: 33842 
    Date: Sat, 02 Aug 2014 09:27:02 GMT 

<?xml version=""1.0"" encoding=""UTF-8""?> 
<creditBureau xmlns=""http://www.transunion.com/namespace"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""> 

<document>response</document> 
<version>2.9</version> 
<transactionControl><userRefNumber>Credit Report Example</userRefNumber> 
<subscriber><industryCode>Z</industryCode></subscriber></transactionControl> 

これは、文書全体のほんの一部です。私はこれをjsonに変換したい。 問題は、ヘッダー部分をスキップまたは削除し、<document>タグから始まるように、実際のxmlから解析を開始する方法です。

このようなファイルは100万以上あります。私は手動で行うことはできません。どうしたらいいですか?どんな助けもありがたい。

答えて

0

あなただけのXML部分 Something like: /<document>(.*)/gs or /"">(.*)/gs

を選択するために、正規表現を使用することができますが、どのようにそのウェブサイトを取得していますか?これは、私がカールでやっていたことと似ていますが、カールから身体を取り出すことができるはずです。

次に、xmlをjsonに変換するライブラリを使用します。あなたはConverting XML to JSON using Python?

P.S.のようなものを使用することができ、その部分については

(これはコメントとしては良いと思いますが、私は十分な評判がないのでここに入れています)

+0

私はウェブサイトを取得していません。私はこのデータをトランニュオンから得る。だから、私はそれをテキストファイルとして読んで、reg expを使ってxmlの部分を選択するということです。 –

+0

それは私がやることです。しかし、より良い方法があるかもしれません。私はPythonでそれほど良くありません。 – darthzejdr

0

以下のような考え方で、それぞれのファイルを読んで不要なヘッダを取り除くことができます。

import re 

file = '''\ 
"HTTP/1.1 100 Continue 
HTTP/1.1 200 OK 
Expires: 0 
Buffer: false 
Pragma: No-cache 
Cache-Control: no-cache 
Server: Transaction_Server/4.1.0(zOS) 
Connection: close 
Content-Type: text/html 
Content-Length: 33842 
Date: Sat, 02 Aug 2014 09:27:02 GMT 

<?xml version=""1.0"" encoding=""UTF-8""?> 
<creditBureau xmlns=""http://www.transunion.com/namespace"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""> 

<document>response</document> 
<version>2.9</version> 
<transactionControl><userRefNumber>Credit Report Example</userRefNumber> 
<subscriber><industryCode>Z</industryCode></subscriber></transactionControl>''' 

# list concept. 
file_list = file.split('\n') 
start = file_list.index('<?xml version=""1.0"" encoding=""UTF-8""?>') 
new_list = file_list[start:] 
print('joined from list:\n', '\n'.join(new_list), sep='') 

# regexp concept. 
new_string = re.sub(r'\A.*(<\?xml.*)\Z', r'\1', file, flags=re.S) 
print('regexp:\n', new_string, sep='') 

テストするファイルがたくさんあるにもかかわらず、正規表現が速いかもしれません。

編集:のtest.xml上でこのような

用途:

import re 

with open('test.xml') as r: 
    file = r.read() 

new_string = re.sub(r'\A.*(<\?xml.*)\Z', r'\1', file, flags=re.S) 

print(new_string) 

編集:

xmlファイルの一括上書きを示すもう一つの例。多くのファイルで使用する前に、必ず最初にテストしてください。小さなテストは私のためにうまく動作します。

import glob, re 

for file in glob.iglob('*.xml'): 
    with open(file) as r: 
     current_string = r.read() 

    new_string = re.sub(r'\A.*(<\?xml.*)\Z', r'\1', current_string, flags=re.S) 

    with open(file, 'w') as w: 
     w.write(new_string) 

読み書きのコーデックを指定する必要があります。

+0

AttributeError: '_io.TextIOWrapper'オブジェクトに属性 'split'がありません。エラーがリストコンセプトに入ります:( –

+0

'TypeError:regexpコンセプトの' TypeError:期待文字列またはバイト様オブジェクト 'ヘルプ! –

+0

第1エラー:[別の投稿回答](https://stackoverflow.com/questions/17569679/python-attributeerror-io-textiowrapper-object-has-no-attribute-split#17570045) –

関連する問題