2014-03-14 3 views
0

У меня есть строка XML, которую я беру из веб-службы wsdl. Я попытался разобрать его с помощью элемента elementTree, но он предназначен только для файлов. Я попытался сохранить его в файле, чтобы его разобрать, но он говорит, что у меня нет разрешения на открытие файла. Таким образом, я использовал это решение, которое я нашел в StackOverflow:Разбор XML-строки с python

try: 
     queryresult = client.service.executeQuery(query) 
except WebFault, e: 
     print e 

tree = ET.ElementTree(ET.fromstring(queryresult)) 
rootElem = tree.getroot() 
result = rootElem.findall(".//result") 

, но когда я печатаю результат я беру значение, как «результат» Элемента на 0x7f6e454bdb90

Я также попытался напечатать

result.text 

или

for s in result: 
    test = s.attrib 

и в результате = rootElem.findall (".// результат") я также попробовал результат = РОО tElem.findall («результат») или результат = rootElem.findall («результаты/результат»)

Это строка XML (я добавил только часть его, потому что он слишком велик):

<?xml version="1.0" encoding="UTF-8"?> <sparql> <head> <variable name="id"/> <variable name="code"/> <variable name="title"/> <variable name="text"/> <variable name="substanceCode"/> <variable name="patientId"/> <variable name="birthTime"/> <variable name="effectiveTime_start"/> </head> <results> <result> <binding name="id"> <literal>df868fff-9d48-11e2-8ee8-833b8491ffe6</literal> </binding> <binding name="code"> <literal>2000</literal> </binding> <binding name="title"> <literal>Administration of substance (procedure)</literal> </binding> <binding name="text"> <literal>Aclarubicin (product)</literal> </binding> <binding name="substanceCode"> <literal>326830005</literal> </binding> <binding name="patientId"> <literal>fictitious1</literal> </binding> <binding name="birthTime"> <literal>1965-03-01T00:00:00.0</literal> </binding> </result> 

Я также попытался @alecxe решение:

def index(request,requestresult): 
    data = requestresult 
    tree = ET.fromstring(data) 
    for literal in tree.findall('.//result/binding/literal') 
     returnresult = literal.text 
    if tokens_p(request): 
     account_id = urllib.unquote(request.session['oauth_token_set']['account_id']) 
     return utils.render_template('ui/index', { 'ACCOUNT_ID': account_id, 'SETTINGS': settings,'returnresult':returnresult}) 
    return HttpResponseRedirect(reverse(login)) 

И тогда я напечатал результаты {{returnresult}} в index.html, но ничего не печатает. Тогда я попробовал:

tree = ET.ElementTree(ET.fromstring(data)) 
rootElem = tree.getroot() 
returnresult = rootElem.findall('.//results/result/binding/literal') 

и печатает элемент «буквального» в 0x7f6e4529fc10 Element «буквального» в 0x7f6e4529fc90 и т.д. И когда я пытаюсь напечатать его:

for literal in rootElem.findall('.//results/result/binding/literal') 
    returnresult = literal.text 

У меня есть ошибка недействительной синтаксис в строке: «за буквальные в rootElem.findall („.// результаты/результат/связывание/буквальный“)»

+0

Что вам нужно получить от узлов результата? – alecxe

+0

значение (например, Aclarubicin) в поле . Но когда я помещаю findall (.// text), ничего не происходит – user1431148

ответ

0

по вашему комментарию, вы хотите получить значение literal тег внутри binding тега, который находится внутри result. В этом случае вы должны использовать .//result/binding/literal выражение XPath:

import xml.etree.ElementTree as ET 

data = """<?xml version="1.0" encoding="UTF-8"?> 
<sparql> 
    <head> 
     <variable name="id"/> 
     <variable name="code"/> 
     <variable name="title"/> 
     <variable name="text"/> 
     <variable name="substanceCode"/> 
     <variable name="patientId"/> 
     <variable name="birthTime"/> 
     <variable name="effectiveTime_start"/> 
    </head> 
    <results> 
    <result> 
     <binding name="id"> 
      <literal>df868fff-9d48-11e2-8ee8-833b8491ffe6</literal> 
     </binding> 
     <binding name="code"> 
      <literal>2000</literal> 
     </binding> 
    </result> 
    </results> 
</sparql>""" 

tree = ET.fromstring(data) 

print [literal.text for literal in tree.findall('.//result/binding/literal')] 

печатает:

['df868fff-9d48-11e2-8ee8-833b8491ffe6', '2000'] 

Примечание Я вырубать XML немного.

Надеюсь, что это поможет.

+0

Я пробовал ваш ответ, но ничего не печатает. Если вы не сократили xml, он также распечатает значение ? – user1431148

+0

@ пользователь1431148 не уверен, в чем проблема. Не могли бы вы предоставить код, который вы используете? (Я бы попробовал весь xml) – alecxe

+0

def index (request, requestresult): data = requestresult tree = ET.fromstring (data) для буквального в tree.findall ('.// ​​result/binding/literal') returnresult = literal.text if tokens_p (request): account_id = urllib.unquote (request.session ['oauth_token_set'] ['account_id']) return utils.render_template ('ui/index', {'ACCOUNT_ID': account_id, 'SETTINGS': настройки, 'returnresult': returnresult}) return HttpResponseRedirect (обратное (логин)) – user1431148

Смежные вопросы