用python解析XML字符串

用python解析XML字符串,python,xml,string,Python,Xml,String,我有一个从WSDLWeb服务获取的XML字符串。我试图用elementTree解析它,但它只用于文件。我试图将它保存在一个文件中以便分析它,但它说我没有打开该文件的权限。所以我使用了stackoverflow中的解决方案: try: queryresult = client.service.executeQuery(query) except WebFault, e: print e tree = ET.ElementTree(ET.fromstring(que

我有一个从WSDLWeb服务获取的XML字符串。我试图用elementTree解析它,但它只用于文件。我试图将它保存在一个文件中以便分析它,但它说我没有打开该文件的权限。所以我使用了stackoverflow中的解决方案:

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

tree = ET.ElementTree(ET.fromstring(queryresult))
rootElem = tree.getroot()
result = rootElem.findall(".//result")
但当我打印结果时,我会在0x7F6E454BB90处获取类似元素“result”的值

我还试着打印

result.text

在result=rootElem.findall(“.//result”)中,我还尝试了result=rootElem.findall(“result”)或result=rootElem.findall(“results/result”)

这是xml字符串(我只添加了一部分,因为它太大了):

然后我在index.html中打印了结果{{returnresult}},但没有打印任何内容。 然后我试着:

tree =  ET.ElementTree(ET.fromstring(data))
rootElem = tree.getroot()
returnresult = rootElem.findall('.//results/result/binding/literal')
它在0x7f6e4529fc10处打印元素'literal',在0x7f6e4529fc90处打印元素'literal',等等。当我尝试打印它时:

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

我在第行中有一个错误无效语法:“for literal in rootElem.findall('.//results/result/binding/literal')”

根据您的评论,您希望获得
literal
标记inside
binding
标记的值。在这种情况下,应使用
//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>432102000</literal>
        </binding>
    </result>
    </results>
</sparql>"""

tree = ET.fromstring(data)

print [literal.text for literal in tree.findall('.//result/binding/literal')]
注意,我已经减少了一点xml


希望对您有所帮助。

您需要从
结果
节点中获得什么?字段中的值(例如Aclarubicin)。但当我把findall(.//text)放进去时,什么也没发生我试过你的答案,但它什么也没印出来。如果您没有减少xml,它还会打印?@user1431148的值,但不确定问题出在哪里。你能提供你正在运行的代码吗?(我会尝试整个xml)def index(request,requestresult):data=requestresult tree=ET.fromstring(data)作为tree.findall('.//result/binding/literal')returnresult=literal.text如果令牌是p(request):account\u id=urllib.unquote(request.session['oauth\u token\u set']['account\u id']))return utils.render_template('ui/index',{'ACCOUNT_ID':ACCOUNT_ID,'SETTINGS':SETTINGS,'returnresult':returnresult})返回HttpResponseRedirect(反向(登录)),然后在index.html中打印{returnresult},以查看是否得到结果。但什么都没有prints@user1431148你应该用你上面发布的代码的格式化版本更新你的问题。
tree =  ET.ElementTree(ET.fromstring(data))
rootElem = tree.getroot()
returnresult = rootElem.findall('.//results/result/binding/literal')
 for literal in rootElem.findall('.//results/result/binding/literal')
     returnresult = literal.text
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>432102000</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', '432102000']