0

例如这是我的 xml

<p1>
     <p2>
         <name>nikki</name>
         <p3>
            <c days="1">1</c>
            <c days="3">5</c>
            <c days="7">9</c>
        </p3>
    </p2>
</p1>

到目前为止,我可以使用提取名称name = etree.XPath('/p1/p2/name/text()')(root)[0]但如何提取 day1 、 day3 和 day7 以获得值 1、5、7 ?

这是我使用 import etree 的代码

name = etree.XPath('/p1/p2/name/text()')(root)[0]

?? day1 = etree.XPath('/p1/p2/p3/c@days="1"/text()')(root)[0]
?? day3 = etree.XPath('/p1/p2/p3/c@days="3"/text()')(root)[0]
?? day7 = etree.XPath('/p1/p2/p3/c@days="7"/text()')(root)[0]

print name , day1 , day2, day7 


OUTPUT WANTED: nikki 1 5 9
4

4 回答 4

2

ElementTree 元素的text属性将为您提供元素标签之间的值。所以:

print name, day1.text, day2.text, day7.text

应该给你预期的输出。

是 ElementTree 元素的文档。

于 2013-01-11T19:50:14.937 回答
0

尝试使用 lxml,它有更好的 xpath 支持,你想多了:

xml=\
"""<p1>
     <p2>
         <name>nikki</name>
         <p3>
            <c days="1">1</c>
            <c days="3">5</c>
            <c days="7">9</c>
        </p3>
    </p2>
</p1>"""
import lxml.etree as et
doc=et.fromstring(xml)
print doc.xpath('.//name/text()|.//c/text()')

出去:

['nikki', '1', '5', '9']

编辑:如果你必须使用标准库,你可以这样做:

print root.find('.//name').text
print [e.text for e in root.findall('.//c')]

出去:

nikki
['1', '5', '9']
于 2013-01-11T21:39:45.600 回答
0

您似乎正在使用 lxml。这是一个建议:

from lxml import etree

XML ="""
<p1>
     <p2>
         <name>nikki</name>
         <p3>
            <c days="1">1</c>
            <c days="3">5</c>
            <c days="7">9</c>
        </p3>
    </p2>
</p1>"""

root = etree.fromstring(XML)

name = root.xpath("p2/name")[0]
p3 = root.xpath("p2/p3")[0]
day1 = p3.xpath('c[@days="1"]')[0]
day3 = p3.xpath('c[@days="3"]')[0]
day7 = p3.xpath('c[@days="7"]')[0]

print name.text, day1.text, day3.text, day7.text 

输出:

nikki 1 5 9

注意谓词(方括号中的过滤器表达式)。

问题中的表达式'/p1/p2/p3/c@days="7"/text()'无效。

于 2013-01-11T20:21:23.247 回答
0
from xml.dom.minidom import parseString

_f = open("your_file_path.xml", "r")
data = _f.read()
_f.close()
dom = parseString(data)

# name
name = dom.getElementsByTagName('name')[0].firstChild.data

# days
itemList = dom.getElementsByTagName("c")
for s in itemList:
    print s.attributes['days'].value

or 

day1 = dom.getElementsByTagName("c")[0].firstChild.nodeValue

or 

day1 = dom.getElementsByTagName("c")[0].firstChild.data
于 2013-01-11T20:31:32.980 回答