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を取得するにはどうすればよいですか?

これがimportetreeを使用した私のコードです

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 Elementのtextプロパティは、要素のタグ間の値を提供します。それで:

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

期待どおりの出力が得られるはずです。

ElementTreeElementのドキュメントは次のとおりです

于 2013-01-11T19:50:14.937 に答える
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 に答える
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 に答える