Нужна помощь в понимании etree xml для Python, работающего со структурой тегов - PullRequest
1 голос
/ 24 сентября 2011

У меня возникли проблемы с пониманием библиотеки python etree для чтения XML-файла.Я довольно новичок в программировании на python ... поэтому xml для меня немного странен ...

У меня есть следующая структура xml в файле:

    <sss version="1.2">
    <date>2011-09-23</date>
    <time>12:32:29</time>
    <origin>OPST</origin>
    <user></user>
    <survey>
        <name>Test</name>
        <version>2011-09-02 15:50:10</version>
        <record ident="A">
            <variable ident="10" type="quantity">
                <name>v_682</name>
                <label>Another question</label>
                <position start="23" finish="24"/>
                <values>
                    <range from="0" to="32"/>
                </values>
            </variable>
            <variable ident="11" type="quantity">
                <name>v_683</name>
                <label>another totally another Question</label>
                <position start="25" finish="26"/>
                <values>
                    <range from="0" to="33"/>
                </values>
            </variable>
            <variable ident="12" type="quantity">
                <name>v_684</name>
                <label>And once more Question</label>
                <position start="27" finish="29"/>
                <values>
                    <range from="0" to="122"/>
                </values>
            </variable>
            <variable ident="20" type="single">
                <name>v_685</name>
                <label>Question with alternatives</label>
                <position start="73" finish="73"/>
                <values>
                    <range from="1" to="6"/>
                    <value code="1">Alternative 1</value>
                    <value code="2">Alternative 2</value>
                    <value code="3">Alternative 3</value>
                    <value code="6">Alternative 4</value>
                </values>
            </variable>
        </record>
    </survey>
</sss>

для чтения элементов iразработал довольно плохой цикл, который не соответствует возможностям библиотеки etree, я думаю ...

from xml.etree.cElementTree import parse
et = parse(open('scheme.xml','rb'))
root = et.getroot()
for i in range(4):
    a= str(root[4][2][i][0].text)
    if a.startswith('v'):
        print root[4][2][i][1].text 

Как я могу использовать структуру тегов: например, чтобы прочитать тег "value" длядобавление текста в список?

Для меня эти учебники по etree довольно сложны ... Может быть, кто-то может показать мне, как использовать поиск по тегам ...?Эти петли такие хрупкие ... Большое спасибо

1 Ответ

0 голосов
/ 24 сентября 2011

Если файл небольшой и вам нужны только элементы <value/>:

#!/usr/bin/env python
import xml.etree.cElementTree as etree

tree = etree.parse('scheme.xml')
for value in tree.getiterator(tag='value'):
    print value.get('code'), value.text

Если файл большой:

def getelements(filename, tag):
    context = iter(etree.iterparse(filename, events=('start', 'end')))
    _, root = next(context) # get root element
    for event, elem in context:
        if event == 'end' and elem.tag == tag:
            yield elem
            root.clear() # free memory

for elem in getelements('scheme.xml', 'value'):
    print elem.get('code'), elem.text

Вывод

1 Alternative 1
2 Alternative 2
3 Alternative 3
6 Alternative 4

Чтобы узнать больше, прочитайте Поиск подэлементов и ElementTree XML API .

...