1

dictにxmlファイルを追加しようとしています。今私がしたいのは、値を失うことなく、値をdictに更新することです。この理由は、xmlファイルをグループ化して、タグの作成者によって行われたすべての変更を表示したいためです。

これがxmlファイルのサンプルです。

<log> 
<logentry 
revision="33185"> 
<author>glv</author> 
<date>2012-08-06T21:01:52.494219Z</date> 
<paths> 

<path 
kind="file" 
action="M">/branches/Patch_4_2_0_Branch/text.xml</path>    

<path 
kind="dir" 
action="M">/branches/Patch_4_2_0_Branch</path> 

</paths> 
<msg>PATCH_BRANCH:N/A 
BUG_NUMBER:N/A 
FEATURE_AFFECTED:N/A 
OVERVIEW:N/A 
Adding the SVN log size requirement to the branch  
</msg> 
</logentry> 
 .... 
</log> 

これが私がPythonで書いたコードです。

from xml.dom import minidom 
import smtplib 
from email.mime.text import MIMEText 
from datetime import datetime 

def xml_data (): 

f = open('C:\opidea_2.xml', 'r') 

data = f.read() 

f.close() 

dom = minidom.parseString(data) 

ic = (dom.getElementsByTagName('logentry')) 

dom = None       
content = '' 
author = {}   
for num in ic: 

authors = num.getElementsByTagName('author') 

if len(authors) > 0: 

  name = authors[0].firstChild.nodeValue 

  author.update({'author': str(name)})  

datef = [] 
xmlDate = num.getElementsByTagName('date')[0].firstChild.nodeValue 
datef = [Good_Time] 
path_change = []  
paths = [x for x in num.getElementsByTagName("paths")[0].childNodes if isinstance(x, minidom.Element)] 

for path in paths:  

  x = path.childNodes[0].nodeValue   

if str(path.getAttribute("kind")) == 'dir': 

  path_change ='Directory location: ' + [str(x)] 
else:  
  path_change ='Filename: ' + [str(x)] 

xmlMsgf = [] 
xmlMsg = num.getElementsByTagName('msg') 


if xmlMsg !='' and len(xmlMsg) > 0: 
  xmlMsgc = xmlMsg[0].firstChild.nodeValue 
  xmlMsgf = [xmlMsgc] 


 else: 
   xmlMsgc = "No comment made." 
   xmlMsgf = [xmlMsgc] 

 authorentry.push{('author',authorA),('date',datef),('path',path_change),('path',xmlMsgf))}           

    for k, v in [(authorentry)]:

        try:

            author[k].append(v)

        except KeyError:

            author[k] = [v]

 author.update({'Date':datef,'Path':path_change,'msg':str(xmlMsgf)}) 
 print author

if __name__ == "__main__": 
  xml_data () 

さて、私が望む最終結果は次のようになります

キー1=glv、date1、path 1a path 1b、msg1、date2、path 2、msg 2、..。

キー2=jsm、date1、path 1、msg1。

author.update({'Date':datef、'Path':path_change、'msg':str(xmlMsgf)})をグループ化して、作成者によるxmlファイルを一覧表示し、作成者が作成した次のセットを追加します。 。どうすればいいのかよくわかりません。どんな助けでもいただければ幸いです。これが私の更新されたコードですが、無効な構文エラーが発生するようです。

  line 151
    authorentry.push{('author',authorA),('date',datef),('path',path_change),('path',xmlMsgf))}           
                    ^
 SyntaxError: invalid syntax
4

1 に答える 1

6

dictに「古い値を保持」することはできません。各キーには1つの値が関連付けられています。

ただし、dictでは集計値タイプを使用できます。たとえば、値としてリストを使用でき、追加するデータを見つけるたびに、関連するリストに追加します。

data = {}

for k, v in [('a', 1), ('a', 2), ('b', 3)]:
    try:
        data[k].append(v)
    except KeyError:
        data[k] = [v]  # a list of one element!

collectionsモジュールには、これをさらに簡単にする便利なコンストラクターがあります。

import collections

data = collections.defaultdict(list)
for k, v in [('a', 1), ('a', 2), ('b', 3)]:
    data[k].append(v)
于 2012-08-30T18:47:36.783 に答える