2017-04-14 7 views
0

私はPython SAXを使ってXMLファイルbuを解析し、そのタグと値を辞書に正常に保存しました。同じタグ名を持つネストされたタグのペアを格納するためにdefaultdictを使用しました。例えば:彼らが空の場合同じキーを持つ複数の値、 '/'で区切られた文字列として読み取られた値、そのキーに従って値を分割する方法は?

<Actions> 
    <Action sequenceNumber="1"> 
     <ActionCode/> 
     <ActionDescription/> 
    </Action> 
    <Action sequenceNumber="2"> 
     <ActionCode/> 
     <ActionDescription/> 
    </Action> 
    <Action sequenceNumber="3"> 
     <ActionCode/> 
     <ActionDescription/> 
    </Action> 

そこで出力は、このようになる:

defaultdict({u'ActionDescription ':[' ' ''、'「]、 U [''、 ''、 '']})

値をMySQLに挿入する必要があるので、列名と値を文字列に入れます。

actionslist_insertstr = "INSERT INTO dbname.Actions (" 
actionslist_valuesstr = "VALUES ('" 

actionslist = handler.actions 

for i, (k, v) in enumerate(actionslist.iteritems()): 
    actionslist_insertstr += k 
    actionslist_valuesstr += "/".join(v) 
    if i < len(actionslist)-1: 
     actionslist_insertstr += "," 
     actionslist_valuesstr += "','"    
actionslist_insertstr += ")" 
actionslist_valuesstr += "')" 

dbname.Actions INTO INSERT(ActionDescription、ActionCode)VALUES( '/ /'、 '/ /')

しかし、私は値が1のように店にしたくありませんデータベース内の文字列。区切り文字を使用して値を行に分割し、列名に従って格納するにはどうすればよいですか?私は値を分割しようとしましたが、キーとの関係がなくなりました。 誰かが私にこの問題の解決方法を教えてもらえると大いに感謝します。ありがとうございました。私が正しく理解していれば

答えて

0

は、あなたがhandler.actionsと呼ばれるデータオブジェクトを持っており、これはアイテムで、今defaultdictです:

{ 
    'ActionDescription': [' ', ' ', ' '], 
    'ActionCode':  [' ', ' ', ' '], 
} 

ので、あなたはXMLを解析されてきた方法で。

これはsequenceNumber=1の説明であり、handler.actions['ActionCode'][0]sequenceNumber=1のコードであることを意味します。

XMLファイルの行は、上記のリストの列になっています。

私が正しい場合は、次の2つの選択肢があります:あなたはXMLを解析する方法を変更することができ

  1. を。 <Action>...</Action>アイテムごとに別々の辞書を作成できるようにする機能があると確信しています。そうであれば、それらを順番に処理することができます。

  2. Python zipコマンドを使用して、2つ(またはそれ以上)のリストを結合することができます。

コード:出力として

# Fake it with hard-coded data 
# actionslist = handler.actions 
actionslist = { 
    'ActionDescription': [ 'd1', 'd2', ''], 
    'ActionCode': ['', 'c2', 'c3'], 
} 

tablename = 'dbname.Actions' 
fieldnames = sorted(actionslist.keys()) 

insert_fields = 'INSERT INTO {table_name} ({field_list})'.format(
    table_name=tablename, 
    field_list=', '.join(fieldnames) 
) 

insert_values = insert_fields + ' VALUES({})' 
values = [actionslist[k] for k in fieldnames] 

for tpl in zip(*values): 
    stmt = insert_values.format(', '.join(map(repr, tpl))) 
    print(stmt) 

、私が取得:

INSERT INTO dbname.Actions (ActionCode, ActionDescription) VALUES('', 'd1') 
INSERT INTO dbname.Actions (ActionCode, ActionDescription) VALUES('c2', 'd2') 
INSERT INTO dbname.Actions (ActionCode, ActionDescription) VALUES('c3', '') 
+0

はありがとうございました!あなたは私を全面的な書き直しから救った! – Coastie

関連する問題