Форум сайта python.su
здравствуйте. есть xml (в приложении). надобно обработать его таким образом, чтобы вывести данные только каждой 4й строки начиная с i0. например i0, i4, i8, i12 и тд. причем еще и посчитать общее количество таких строк. например i172 последняя. итого 43 значения. как это сделать? вроде бы тут нужны циклы… помогите пожалуйста. спасибо.
Отредактировано aliennick (Сен. 23, 2014 23:56:51)
Прикреплённый файлы:
request.xml (3,2 KБ)
Офлайн
import xml.etree.ElementTree as ET import re my_xml = """<?xml version="1.0" encoding="UTF-8"?> <request> <int_cnt>176</int_cnt> <str_cnt>0</str_cnt> <bin_cnt>0</bin_cnt> <i0>1</i0> <i1>1</i1> <i2>0</i2> <i3>-1</i3> <i4>34</i4> ... <i174>0</i174> <i175>-1</i175> <ret>0</ret> <error/> </request> """ element_re = re.compile('^i(\d+)$') def filter_i_elements(item): result = element_re.match(item.tag) if not result or int(result.group(1)) % 4: return False return True root = ET.fromstring(my_xml) i_elements = filter(filter_i_elements, root.getchildren()) print i_elements print len(i_elements)
[<Element 'i0' at 0x1fa58f0>, <Element 'i4' at 0x1fa59f0>, ..., <Element 'i172' at 0x1fb8e50>]
44
Офлайн
спасибо, буду пробовать. еще варианты?
Офлайн
aliennick
еще варианты?
#!/usr/bin/env python3 import xml.etree.ElementTree as ET import re text = """\ <?xml version="1.0" encoding="UTF-8"?> <request> <int_cnt>176</int_cnt> <str_cnt>0</str_cnt> <bin_cnt>0</bin_cnt> <i0>1</i0> <i1>1</i1> <i2>0</i2> <i3>-1</i3> <i4>34</i4> <i5>0</i5> <i6>0</i6> <i7>-1</i7> <i8>38</i8> <i9>1</i9> <i10>0</i10> <i11>-1</i11> <i12>39</i12> <i13>1</i13> <i14>0</i14> <i15>-1</i15> <i16>83</i16> <i17>1</i17> <i18>0</i18> <i19>-1</i19> <i20>110</i20> <i21>1</i21> <i22>0</i22> <i23>-1</i23> <i24>111</i24> <i25>1</i25> <i26>0</i26> <i27>-1</i27> <i28>112</i28> <i29>1</i29> <i30>0</i30> <i31>-1</i31> <i32>117</i32> <i33>1</i33> <i34>0</i34> <i35>-1</i35> <i36>119</i36> <i37>1</i37> <i38>0</i38> <i39>-1</i39> <i40>123</i40> <i41>1</i41> <i42>0</i42> <i43>-1</i43> <i44>133</i44> <i45>1</i45> <i46>0</i46> <i47>-1</i47> <i48>134</i48> <i49>1</i49> <i50>0</i50> <i51>-1</i51> <i52>135</i52> <i53>1</i53> <i54>0</i54> <i55>-1</i55> <i56>137</i56> <i57>1</i57> <i58>0</i58> <i59>-1</i59> <i60>142</i60> <i61>1</i61> <i62>0</i62> <i63>-1</i63> <i64>164</i64> <i65>1</i65> <i66>0</i66> <i67>-1</i67> <i68>169</i68> <i69>1</i69> <i70>0</i70> <i71>-1</i71> <i72>170</i72> <i73>1</i73> <i74>0</i74> <i75>-1</i75> <i76>171</i76> <i77>1</i77> <i78>0</i78> <i79>-1</i79> <i80>172</i80> <i81>1</i81> <i82>0</i82> <i83>-1</i83> <i84>175</i84> <i85>1</i85> <i86>0</i86> <i87>-1</i87> <i88>188</i88> <i89>1</i89> <i90>0</i90> <i91>-1</i91> <i92>190</i92> <i93>1</i93> <i94>0</i94> <i95>-1</i95> <i96>192</i96> <i97>1</i97> <i98>0</i98> <i99>-1</i99> <i100>193</i100> <i101>1</i101> <i102>0</i102> <i103>-1</i103> <i104>200</i104> <i105>1</i105> <i106>0</i106> <i107>-1</i107> <i108>207</i108> <i109>1</i109> <i110>0</i110> <i111>-1</i111> <i112>211</i112> <i113>1</i113> <i114>0</i114> <i115>-1</i115> <i116>238</i116> <i117>0</i117> <i118>0</i118> <i119>-1</i119> <i120>264</i120> <i121>1</i121> <i122>0</i122> <i123>-1</i123> <i124>265</i124> <i125>1</i125> <i126>0</i126> <i127>-1</i127> <i128>267</i128> <i129>1</i129> <i130>0</i130> <i131>-1</i131> <i132>268</i132> <i133>1</i133> <i134>0</i134> <i135>-1</i135> <i136>269</i136> <i137>1</i137> <i138>0</i138> <i139>-1</i139> <i140>270</i140> <i141>1</i141> <i142>0</i142> <i143>-1</i143> <i144>2268</i144> <i145>1</i145> <i146>0</i146> <i147>-1</i147> <i148>2269</i148> <i149>1</i149> <i150>0</i150> <i151>-1</i151> <i152>2271</i152> <i153>1</i153> <i154>0</i154> <i155>-1</i155> <i156>2272</i156> <i157>1</i157> <i158>0</i158> <i159>-1</i159> <i160>2273</i160> <i161>1</i161> <i162>0</i162> <i163>-1</i163> <i164>2275</i164> <i165>1</i165> <i166>0</i166> <i167>-1</i167> <i168>2276</i168> <i169>1</i169> <i170>0</i170> <i171>-1</i171> <i172>2277</i172> <i173>1</i173> <i174>0</i174> <i175>-1</i175> <ret>0</ret> <error/> </request> """ doc = ET.fromstring(text) pat = r'i\d+' lst = [i.text for i in doc if re.match(pat, i.tag)][::4] print(lst, len(lst))
[guest@localhost xmltag4]$ ./xmltag4.py
['1', '34', '38', '39', '83', '110', '111', '112', '117', '119', '123', '133', '134', '135', '137', '142', '164', '169', '170', '171', '172', '175', '188', '190', '192', '193', '200', '207', '211', '238', '264', '265', '267', '268', '269', '270', '2268', '2269', '2271', '2272', '2273', '2275', '2276', '2277'] 44
[guest@localhost xmltag4]$
Отредактировано py.user.next (Сен. 24, 2014 11:17:15)
Офлайн
эх… спасибо конечно только вот выводятся не текстовые значения… надо куда-то воткнуть .text чтобы выводились именно 38. 39, 83….
Офлайн
aliennickДобавил .text
надо куда-то воткнуть .text чтобы выводились именно 38. 39, 83….
Офлайн
ок. работает корректно. спасибо. теперь бы еще сделать так, чтобы результат был тот же, но если бы файл xml был доступен только по URL.
вот что значит изначально некорректно поставленный вопрос…
Офлайн
вообще это все выглядит вот так:
#! /usr/bin/python # -*- coding: utf-8 -*- import sys, urllib, xml.etree.ElementTree as ET, json # Первый аргумент - адрес хоста try: host = sys.argv[1] except: sys.stderr.write('Host not defined') exit(64) # Второй и следующие аргументы - в нашем случае они могут быть не нужны try: param = sys.argv[2] index = sys.argv[3] if ':' in param: param, sid = param.split(':') except: sys.stderr.write('Parameter not defined') exit(64) # Т.к. разные параметры находятся по разным URL-ам, приходится их формировать тут вручную, # ориентируясь на параметр INPUT = ('i1', 'i8') #это и есть param = sys.argv(2), вот тут нужны как раз все i, как это сделать? if param in INPUT: Url = "http: //%s/blablabla/blabla/%s/blablablabla" % (host, index) # или может быть в param искать? #первая переменная - это хост, вторая переменная это цифра в url # Запрос try: xml=urllib.urlopen(Url).read() except: sys.stderr.write('Service unavailable') exit(69) # Валидация XML try: Data = ET.fromstring(xml) except: sys.stderr.write('Can not get or perform data') exit(69) # и вот теперь надо сделать Запрос к XML, который доступен по URL выше #использовать это предполагается так: запускаем скрипт, указываем хост(первую переменную), указываем что искать(INPUT = ('i1', 'i8' )), указываем вторую переменную. ENTER. и вот тут нужен именно такой вывод как вы сделали(значения всех i и общее количество значений).
Отредактировано aliennick (Сен. 24, 2014 14:03:00)
Офлайн
ну вот, теперь ответов нет +(
Офлайн
ладно… все равно всем спасибо
Офлайн