Python replace () в XML файле - PullRequest
       45

Python replace () в XML файле

0 голосов
/ 06 августа 2020

Я столкнулся с другой проблемой.

У меня есть своего рода XML файл с примером кода:

<case classname="perf" name="device">
    <Type>GET</Type>
    <Name>xxx</Name>
    <Request>Something</Request>
</case>

<case2 name="device_n>
    <Type>GET</Type>
    <Name>yyy</Name>
    <Request>Something</Request>
</case2>

<case...n>
...
</case...n>

Как я могу заменить xxx на «устройство» и yyy в case2 должно быть device_n?

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

with open('some_xml.xml') as parsed:
    if line in parsed.readlines.startswith("name="):
        line.replace('', "name=... #what's now?

Это должен быть своего рода итератор, потому что у меня много дел.

Ответы [ 2 ]

2 голосов
/ 06 августа 2020

Может быть более умный способ сделать это с помощью регулярного выражения, но базовый c поиск строки, похоже, работает:

import io

data = '''
<case classname="perf" name="device">
    <Type>GET</Type>
    <Name>xxx</Name>
    <Request>Something</Request>
</case>

<case2 name="device_n">
    <Type>GET</Type>
    <Name>yyy</Name>
    <Request>Something</Request>
</case2>'''

strOut="" # new string
f = io.StringIO(data)  # load string data as file text
for rowx in f:  # each line in data
    row = rowx.rstrip()  # remove newline
    if ' name="' in row: # <case name=...>
        nm = row[row.index(' name="')+7:len(row)-2] # get name
    if "<Name>" in row and nm:  # <Name>....
        idx = row.index("<Name>") + 6
        strOut += row[:idx] + nm + "</Name>\n"  # set name field here
        nm = ""  # in case bad block, don't copy wrong name
    else:
        strOut += row + "\n"  # copy line to new string

print(strOut)

Вывод

<case classname="perf" name="device">
    <Type>GET</Type>
    <Name>device</Name>
    <Request>Something</Request>
</case>

<case2 name="device_n">
    <Type>GET</Type>
    <Name>device_n</Name>
    <Request>Something</Request>
</case2>
0 голосов
/ 08 августа 2020

Другой подход (с использованием xml синтаксического анализа)

import xml.etree.ElementTree as ET

to_replace = {".//case/Name":'device',".//case2/Name":'device_n'}
xml = '''<r>
<case classname="perf" name="device">
    <Type>GET</Type>
    <Name>xxx</Name>
    <Request>Something</Request>
</case>

<case2 name="device_n">
    <Type>GET</Type>
    <Name>yyy</Name>
    <Request>Something</Request>

 </case2>
  </r>'''
root = ET.fromstring(xml)
for x_path,new_val in to_replace.items():
  ele = root.find(x_path)
  ele.text = new_val
ET.dump(root)

вывод

<r>
<case classname="perf" name="device">
    <Type>GET</Type>
    <Name>device</Name>
    <Request>Something</Request>
</case>

<case2 name="device_n">
    <Type>GET</Type>
    <Name>device_n</Name>
    <Request>Something</Request>

 </case2>
  </r>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...