2012-02-07 2 views
5

Я очень новичок в написании сценариев на Python, я пытаюсь использовать 2,7 ElementTree для анализа XML-файла, а затем обновлять/заменять атрибуты конкретных элементов со значениями, полученными из файла тестовых данных. Идея состоит в том, чтобы иметь возможность использовать базовый XML-файл, чтобы затем загружать и заполнять поля конкретными тестовыми данными и т. Д., А затем сохранять в виде уникального файла XML.Обновление элементов XML и значений атрибутов с помощью Python etree

Моей идеей было предоставить исходные данные из файла CSV путем чтения файла в строку, затем нарезая строку на отметках разделителя и добавьте в список (сделанный так). Затем используйте etree, чтобы как-то обновить или удалить/заменить атрибут значением specialc из списка.

Я посмотрел в документации Python ElementTree & видели прозрачный() и удалить() элемент objectsbut Я понятия не имею, синтаксиса, чтобы использовать их должным образом

приведен пример XML для изменения как ниже, атрибуты с ХХХХХ должны быть заменены/обновлены:

<TrdCaptRpt RptID="10000001" TransTyp="0"> 
    <RptSide Side="1" Txt1="XXXXX"> 
     <Pty ID="XXXXX" R="1"/> 
    </RptSide> 
</TrdCaptRpt> 

Намеченный результат будет, например:

<TrdCaptRpt RptID="10000001" TransTyp="0"> 
    <RptSide Side="1" Txt1="12345"> 
     <Pty ID="ABCDE" R="1"/> 
    </RptSide> 
</TrdCaptRpt> 

Как использовать команды etree для изменения базового XML для обновления с помощью элемента из списка []?

+0

Можете ли вы также предоставить данные образца и желаемый результат на основе этого? – Daenyth

ответ

11

Для такого рода работы, я всегда рекомендую BeautifulSoup, потому что он имеет очень легко узнать API:

from BeautifulSoup import BeautifulStoneSoup as Soup 

xml = """ 
<TrdCaptRpt RptID="10000001" TransTyp="0"> 
    <RptSide Side="1" Txt1="XXXXX"> 
     <Pty ID="XXXXX" R="1"/> 
    </RptSide> 
</TrdCaptRpt> 
""" 

soup = Soup(xml) 
rpt_side = soup.trdcaptrpt.rptside 
rpt_side['txt1'] = 'Updated' 
rpt_side.pty['id'] = 'Updated' 

print soup 

Пример вывода:

<trdcaptrpt rptid="10000001" transtyp="0"> 
<rptside side="1" txt1="Updated"> 
<pty id="Updated" r="1"> 
</pty></rptside> 
</trdcaptrpt> 

Edit: С xml.etree.ElementTree вы можете использовать следующие сценарий:

from xml.etree import ElementTree as etree 

xml = """ 
<TrdCaptRpt RptID="10000001" TransTyp="0"> 
    <RptSide Side="1" Txt1="XXXXX"> 
     <Pty ID="XXXXX" R="1"/> 
    </RptSide> 
</TrdCaptRpt> 
""" 

root = etree.fromstring(xml) 
rpt_side = root.find('RptSide') 
rpt_side.set('Txt1', 'Updated') 
pty = rpt_side.find('Pty') 
pty.set('ID', 'Updated') 
print etree.tostring(root) 

Пример вывода:

<TrdCaptRpt RptID="10000001" TransTyp="0"> 
    <RptSide Side="1" Txt1="Updated"> 
     <Pty ID="Updated" R="1" /> 
    </RptSide> 
</TrdCaptRpt> 
+0

Большое спасибо, когда я наконец получил BS, чтобы правильно установить вашу рекомендацию. Меня интересуют другие способы, есть ли метод, использующий стандартные команды eTree? –

+0

@NickH Я обновил свой ответ на примере с помощью 'ElementTree' – jcollado

+0

Большое спасибо, я взломаю этот подход. –