2013-08-23 5 views
-4

Документы всегда плохо написаны, примеры более полезны.Как преобразовать объекты xml в объекты python?

это мой XML-файл:

<wordbook> 
    <item> 
    <name>engrossment</name> 
    <phonetic><![CDATA[ɪn'grəʊsmənt]]></phonetic> 
    <meaning><![CDATA[n. 正式缮写的文件,专注]]></meaning> 
    </item> 
    <item> 
    <name>graffiti</name> 
    <phonetic><![CDATA[ɡrəˈfi:ti:]]></phonetic> 
    <meaning><![CDATA[n.在墙上的乱涂乱写(复数形式)]]></meaning> 
    </item> 
    <item> 
    <name>pathology</name> 
    <phonetic><![CDATA[pæˈθɔlədʒi:]]></phonetic> 
    <meaning><![CDATA[n. 病理(学);〈比喻〉异常状态]]></meaning> 
    </item> 
<wordbook> 

это мой питон класс:

class Item(Base): 
    name = Column(String(50), primary_key=True) 
    phonetic = Column(String(50), default='') 
    meaning = Column(UnicodeText, nullable=False) 

выбрать XML-парсер вам нравится


наконец, я использую xmltodict для синтаксического анализа, lxml для записи:

from lxml import etree 

wordbook = etree.Element('wordbook') 
for one in items: 
    item = etree.Element('item') 
    name = etree.Element('name') 
    name.text = one.name 
    phonetic = etree.Element('phonetic') 
    phonetic.text = etree.CDATA(one.phonetic) 
    meaning = etree.Element('meaning') 
    meaning.text = etree.CDATA(one.meaning) 
    if 1: 
     item.append(name) 
     item.append(phonetic) 
     item.append(meaning) 
    wordbook.append(item) 
s = etree.tostring(wordbook, pretty_print=True, encoding='utf8') 
print s 
+0

попытайтесь найти примеры в документах beautifulsoup и на stackoverflow – metaphy

+1

«Документы всегда плохо написаны» - да, нет. Единственное, что я должен сказать, это [RTFM] (http://wiki.python.org/moin/PythonXml). – l4mpi

+0

Есть много примеров в github-источнике sqlalchemy, поэтому я могу grep его, примеры лучше для новичков – metaphy

ответ

1

Я бы с помощью xmltodict:

# -*- coding: utf-8 -*- 
import xmltodict 

data = """<wordbook> 
    <item> 
    <name>engrossment</name> 
    <phonetic><![CDATA[ɪn'grəʊsmənt]]></phonetic> 
    <meaning><![CDATA[n. 正式缮写的文件,专注]]></meaning> 
    </item> 
    <item> 
    <name>graffiti</name> 
    <phonetic><![CDATA[ɡrəˈfi:ti:]]></phonetic> 
    <meaning><![CDATA[n.在墙上的乱涂乱写(复数形式)]]></meaning> 
    </item> 
    <item> 
    <name>pathology</name> 
    <phonetic><![CDATA[pæˈθɔlədʒi:]]></phonetic> 
    <meaning><![CDATA[n. 病理(学);〈比喻〉异常状态]]></meaning> 
    </item> 
</wordbook>""" 

data = xmltodict.parse(data, encoding='utf-8') 

for item in data['wordbook']['item']: 
    print item['name'] 

печатает:

engrossment 
graffiti 
pathology 

Вы также можете использовать BeautifulSoup или lxml - это дело вкуса. Идея практически такая же: перебирайте теги item и создавайте в цикле Item.

Надеюсь, что это поможет.

+0

Спасибо, я знаю, как разбирать и писать xml в java год назад. – metaphy

+0

Приятно изучить xml-парсинг за считанные минуты, с помощью вашего примера. Год назад я провел неделю или больше. – metaphy

Смежные вопросы