Форум сайта python.su
0
Приветствую! Есть некий текстовый файл - test.xml
<?xml version=“1.0” encoding=“UTF-8”?>
<Document>
<NUMBER>00000025</NUMBER>
<Date>2016-02-04</Date>
</Document>
Нужно, чтобы скриптом число в тегах <NUMBER> увеличивалось на единицу.
Как это сделать?
Офлайн
568
use lxml
Офлайн
0
FishHook, спасибо. Буду изучать)
Офлайн
253
:) do not use lxml
В 90% случаев regexp решает задачу проще и быстрее.
изучайте модуль re. Еще потребуется (если конечно вы не считаете увеличением на единицу увеличение строки на единицу “011”->“0111”)
>>> int("0000222") 222 >>> "{0:07d}".format(222) '0000222'
import re s="""<?xml version="1.0" encoding="UTF-8"?> <Document> <NUMBER>00000025</NUMBER> <Date>2016-02-04</Date> </Document>""" >>> print(re.sub(r"<NUMBER>(\d+)</NUMBER>",lambda x:"<NUMBER>{:08d}</NUMBER>".format(int(x.group(1))+1),s,count=1)) <?xml version="1.0" encoding="UTF-8"?> <Document> <NUMBER>00000026</NUMBER> <Date>2016-02-04</Date> </Document>
Отредактировано doza_and (Май 5, 2016 21:10:13)
Офлайн
568
doza_andНу да, если вот это извращение быстрее и проще чем вот такой код
regexp решает задачу проще и быстрее.
root = etree.fromstring(s) node = root.find("NUMBER") node.text = str(int(node.text) + 1)
Офлайн
857
>>> import re >>> >>> s = """ ... <?xml version="1.0" encoding="UTF-8"?> ... <Document> ... <NUMBER>00000025</NUMBER> ... <Date>2016-02-04</Date> ... </Document> ... """ >>> >>> def tr(s): ... return '{0:0{1}}'.format(int(s) + 1, len(s)) ... >>> out = re.sub(r'(?<=<NUMBER>)\d+', lambda mo: tr(mo.group()), s) >>> print(out) <?xml version="1.0" encoding="UTF-8"?> <Document> <NUMBER>00000026</NUMBER> <Date>2016-02-04</Date> </Document> >>>
FishHookЧерез lxml не заменишь так, чтобы не затрагивать остальные теги. Остальные теги потом будут транслироваться с изменением регистра. Document может превратиться в document, а NUMBER - в number. Для программ это неважно, а для человека может быть важно.
то я снимаю шляпу
Отредактировано py.user.next (Май 6, 2016 06:06:56)
Офлайн
568
py.user.nextА для стандарта? xml - регистронезависимый язык, зачем использовать его как регистрозависимый?
Для программ это неважно, а для человека может быть важно.
<Document> <NUMBER>26</NUMBER> <Date>2016-02-04</Date> </Document>
Офлайн
857
FishHook
А для стандарта? xml - регистронезависимый язык
>>> import lxml.etree >>> >>> doc = lxml.etree.parse('f.xml') >>> root = doc.getroot() >>> >>> root.find('number') >>> root.find('NUMBER') <Element NUMBER at 0xb6fd770c> >>> >>> root.xpath(r'.//number') [] >>> root.xpath(r'.//NUMBER') [<Element NUMBER at 0xb6fd766c>] >>>
>>> from xml.etree import ElementTree as ET >>> >>> doc = ET.parse('f.xml') >>> root = doc.getroot() >>> >>> root.find('number') >>> root.find('NUMBER') <Element 'NUMBER' at 0xb73dacac> >>> >>> root.findall(r'.//number') [] >>> root.findall(r'.//NUMBER') [<Element 'NUMBER' at 0xb73dacac>] >>>
<?xml version="1.0" encoding="UTF-8"?><document><number>00000025</number><date>2016-02-04</date></document>
FishHookИ почему у тебя там 26? Ведь 00000025, как и 26, - это не число, а текстовая строка.<NUMBER>26</NUMBER>
Отредактировано py.user.next (Май 6, 2016 08:21:46)
Офлайн
253
FishHookСнимайте шляпу.
то я снимаю шляпу
Отредактировано doza_and (Май 6, 2016 08:20:58)
Офлайн
857
doza_andНе только на совести автора регекспа, может быть и так впоследствии
Да и xpath обычно ничуть не проще регулярного выражения. Однако надо отметить, что надежность регулярки конечно ниже (все на совести автора регулярного выражения).
<?xml version="1.0" encoding="UTF-8"?>
<Document>
<!-- <NUMBER>00000025</NUMBER> -->
<NUMBER>00000030</NUMBER>
<Date>2016-02-04</Date>
</Document>
Отредактировано py.user.next (Май 6, 2016 08:27:07)
Офлайн