2013-11-19 2 views
1

У меня есть список словарей и вы хотите итерации по клавишам, чтобы избежать символов xml. Мне нужно найти строки, содержащие символы, требующие xml escaping, обновить их и добавить их обратно в список словарей.xml excape form a python dictionary

Есть два ключа, которые необходимо проверить и обновить «имя» и «имя1».

Мой список выглядит следующим образом:

list: [{'level1': 3, 'code1': u'7000', 'name1': u'Donations received in the field', 'code': u'6100', 'name': u'Per diem', 'level': 3, 'balance': 0.0, 'balance1': -1986.9100000000001}, {'level1': 3, 'code1': u'7100', 'name1': u'Interest income', 'code': u'6101', 'name': u'Team living Expenses', 'level': 3, 'balance': 0.0, 'balance1': 0.0}, etc ... ] 

Мой код до сих пор, но «ключ» переменная возвращает целое число и «Вэл» держит ключ ... (например: «level1») и он никогда не делает это в сокращении лямбда.

def get_lines(self,data): 
    if data['form']['export_format'] == 'xls': 
     for row in self.result_temp: 
      for key,val in row.items(): 
       if key == 'name' or key == 'name1': 
        reduce(lambda s,r: s.replace(*r), 
         [('&', '&'), 
         ('<', '&lt;'), 
         ('>', '&gt;'), 
         ("'", '&#39;'), 
         ('"', '&quot;')], 
         self.result_temp[row][val]) 
    return self.result_temp 
+1

Вам не нужно перебирать все словарные статьи. Просто перебирайте ключи 'name',' name1'. – falsetru

+0

Спасибо @falsetru ... не могли бы вы привести пример? – ardochhigh

ответ

2

Использование cgi.escape, если это возможно (", ' не спасся cgi.escape):

>>> import cgi 
>>> cgi.escape("""<hello "spam" & 'egg'>'""") 
'&lt;hello "spam" &amp; \'egg\'&gt;\'' 

И вам не нужно перебирать весь словарь элементов. Просто повторите name, name1.

def get_lines(self,data): 
    if data['form']['export_format'] == 'xls': 
     for row in self.result_temp: 
      for key in ('name', 'name1'): 
       if key not in row: 
        continue 
       row[key] = cgi.escape(row[key]) 
    return self.result_temp 

КСТАТИ в коде вопроса, возвращаемое значение reduce не ставится обратно в словарь.

+0

Спасибо за каждый чистый код ... отлично работает. – ardochhigh

1

Ознакомьтесь с инструментами SAX и проверьте, подходит ли это для ваших нужд, прежде чем совершать собственные действия.

from xml.sax.saxutils import escape 

escape_string = """<escape "foo" & 'bar'>""" 
extra_entities = {"'": "&#39;", '"': "&quot;"} 
escape(escape_string, extra_entities)