как преобразовать элементы списка в соответствующий файл в python / mongodb / elementTree - PullRequest
1 голос
/ 21 марта 2012

Я новичок в Python. Теперь его Python 2.7

Я обрабатываю xml в elementTree и использую Mongodb. XML, который я собираюсь обработать, это "http://www.sec.gov/Archives/edgar/usgaap.rss.xml" ниже приведен код для этого:

import os
import cgi
import sqlite3 as litefire
import sys
sys.stderr = sys.stdout
from xml.etree import ElementTree
from pymongo import Connection
connc2=Connection('localhost',27017)
db2=connc2['rss']
rss=db2.rss

xmlrss=[]
treexsdr = ElementTree.parse('xbrlrss_all.xml')
i=0
k=0
o=0
o2=0
iter = treexsdr.getiterator()

for element in iter:
    if element.tag:
        o=i+k
        xmlname=element.tag
    if element.keys():
        attributedict = dict(element.items())
        for name, value in element.items():
            krishna=element.items()
    if element.text:
        text = element.text

    xmlnamelist={"xmlname":xmlname,"text":text,"ownid":o,"parentid":o2,"xmlattkeys":{k:v for k,v in krishna}}

    xmlrss.append(xmlnamelist)

    if element.getchildren():
        o2=o
        for child in element:
            k=k+1
    i=i+1

rss.insert(xmlrss)

Сообщение об ошибке, которое я получил в IDE, как показано ниже, при применении krishna = dict (element.items ()):

Message File Name   Line    Position    
Traceback               
    <module>    D:\test\mongo_rss.py    44      
    insert  C:\Python27\lib\site-packages\pymongo\collection.py 312     
InvalidDocument: key '{http://www.sec.gov/Archives/edgar}file' must not contain '.' 

Если krishna = element.items (), то в mongodb я получаю:

{
  "_id" : ObjectId("4f69bb6e17ea930fd803a958"),
  "text" : "en-us",
  "xmlname" : "language",
  "xmlattkeys" : [["href", "http://www.sec.gov/Archives/edgar/xbrlrss.all.xml"], ["type", "application/rss+xml"], ["rel", "self"]],
  "parentid" : 2,
  "ownid" : 16
}

Но я хочу

{
  "_id" : ObjectId("4f69bb6e17ea930fd803a958"),
  "text" : "en-us",
  "xmlname" : "language",
  "xmlattkeys" : {"href":"http://www.sec.gov/Archives/edgar/xbrlrss.all.xml", "type":"application/rss+xml", "rel":"self"},
  "parentid" : 2,
  "ownid" : 16
}

Пожалуйста, помогите мне в этом.

Ответы [ 3 ]

5 голосов
/ 21 марта 2012

Вместо

for name, value in element.items():
    krishna=element.items()

do

krishna = dict(element.items())

(И, возможно, рассмотрите возможность использования более описательного имени для этой переменной.)

1 голос
/ 21 марта 2012

Вы можете попробовать это

 xmlnamelist={"xmlname":xmlname,"text":text,"xmlattkeys":dict(krishna)}

специальная форма (список итераций) должна позволять это. Еще несколько исправлений:

for element in iter:
    xmlname = element.tag if element.tag else ""
    attributedict = dict(element.items()) if element.keys() else {}
    text = element.text if element.text else ""
    xmlnamelist = {"xmlname"    :xmlname,
                   "text"       :text,
                   "xmlattkeys" :attributedict}
    xmlrss.append(xmlnamelist)

Обратите внимание, что вам нужно предоставить значения по умолчанию или вы рискуете, что переменные не будут объявлены или заполнены старыми (ложными) значениями.

1 голос
/ 21 марта 2012

Вы можете использовать словесное понимание:

xmlnamelist={"xmlname":xmlname,"text":text,"xmlattkeys": {k:v for k,v in krishna}}
...