Найти - Пользователи
Полная версия: вывод данных из xml
Начало » Центр помощи » вывод данных из xml
1 2
aliennick
здравствуйте. есть xml (в приложении). надобно обработать его таким образом, чтобы вывести данные только каждой 4й строки начиная с i0. например i0, i4, i8, i12 и тд. причем еще и посчитать общее количество таких строк. например i172 последняя. итого 43 значения. как это сделать? вроде бы тут нужны циклы… помогите пожалуйста. спасибо.

GreyZmeem
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
спасибо, буду пробовать. еще варианты?
py.user.next
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]$
aliennick
эх… спасибо конечно только вот выводятся не текстовые значения… надо куда-то воткнуть .text чтобы выводились именно 38. 39, 83….
py.user.next
aliennick
надо куда-то воткнуть .text чтобы выводились именно 38. 39, 83….
Добавил .text
aliennick
ок. работает корректно. спасибо. теперь бы еще сделать так, чтобы результат был тот же, но если бы файл xml был доступен только по URL.

вот что значит изначально некорректно поставленный вопрос…
aliennick
вообще это все выглядит вот так:

#! /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 и общее количество значений).



блин я только начал учить этот язык а от меня уже сразу требуют невозможного….

можно ли к вводимым данным (INPUT = ('i1', ‘i8’ )) прибавить переменную??? + str(С) где “С” будет именно цифрой. цифру можно будет получать из массива. от 1 до 200 например. получится тогда корректный удовлетворяющий критериям скрипт:

C: /XXXX.py 10.10.10.10 i 2 (тут если С = 8 то получится именно i8)

а запрос к xml будет тогда выглядеть так:

if param in INPUT:
print Data.find(param).text

и вывод будет равен 38 потому что в xml <i8>38</i8>

но к праметру “text” нельзя как я онял добавить переменную… с этим параметром вообще ничего нельзя делать

для меня это пока слишком сложно… но сделать нужно… думал вот может на примере пойму что и как, а то пока учебник зубрю… мне до этого момента как пешком до африки

заранее спасибо.
aliennick
ну вот, теперь ответов нет +(
aliennick
ладно… все равно всем спасибо
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB