簡體   English   中英

使用 ElementTree 遞歸獲取 xml 標記值

[英]Fetch xml tag values recursively using ElementTree

我有一個類型的 xmk:

<SCHOOL>
    <GROUP name="GetStudInfo">

        <DATA>
            <NAME type="char">Sahil Jha</NAME>
            <STD>11th</STD>
        </DATA>

        <DATA>
            <NAME type="char">Rashmi Kaur</NAME>
            <STD>11th</STD>
        </DATA>

        <DATA>
            <NAME type="char">Palak Bisht</NAME>
            <STD>11th</STD>
        </DATA>
</SCHOOL>

我需要獲取 NAME、STD 的值。 我試過這樣做:

e = ET.ElementTree(ET.fromstring(getunitinfo_str))
    for elt in e.iter():
        print("{} {}".format(elt.tag, elt.text))

但這也涵蓋了其他值:Output:

SCHOOL

GROUP


DATA

NAME Sahil Jha
STD 11th
DATA

NAME Rashmi Kaur
STD 11th
DATA

NAME Palak Bisht
STD 11th
{}

預期的 O/p:

{'Sahil Jha':'11th', 'Rashmi Kaur'::'11th', 'Palak Bisht':'11th'}

但格式應該是NAME:STD類型。 我哪里錯了?

正如@furas 提到的,您可以使用 XPATH 查找所有DATA元素,然后找到NAMESTD元素:


import xml.etree.ElementTree as ET

xml = '''<SCHOOL>
    <GROUP name="GetStudInfo">

        <DATA>
            <NAME type="char">Sahil Jha</NAME>
            <STD>11th</STD>
        </DATA>

        <DATA>
            <NAME type="char">Rashmi Kaur</NAME>
            <STD>11th</STD>
        </DATA>

        <DATA>
            <NAME type="char">Palak Bisht</NAME>
            <STD>11th</STD>
        </DATA>
</GROUP>
</SCHOOL>'''


e = ET.fromstring(xml)
for data_tag in e.findall('DATA'):
    name = data_tag.find('NAME')
    std = data_tag.find('STD')
    print("{} {}".format(name.text, std.text))

或者您可以使用字典理解來獲取您想要的字典:

my_dict = {
    data_tag.find('NAME').text: data_tag.find('STD').text
    for data_tag in e.findall('.//DATA')
}
print(my_dict)

您需要的不僅僅是print() - 您需要if/else檢查elt.tag以僅獲取NAME和`STD。

因為NAMESTD是不同的標簽,所以當你得到STD時,你必須在一些變量中記住NAME才能使用它

name = None  # default value at start

for elt in e.iter():
    if elt.tag == 'NAME':
        name = elt  # remember element
    if elt.tag == 'STD':
        print("{}:{}".format(name.text, elt.text))

或者您可以使用xpath就像在@qouify 回答中一樣。


最少的工作代碼

getunitinfo_str = '''
<SCHOOL>
    <GROUP name="GetStudInfo">

        <DATA>
            <NAME type="char">Sahil Jha</NAME>
            <STD>11th</STD>
        </DATA>

        <DATA>
            <NAME type="char">Rashmi Kaur</NAME>
            <STD>11th</STD>
        </DATA>

        <DATA>
            <NAME type="char">Palak Bisht</NAME>
            <STD>11th</STD>
        </DATA>
    </GROUP>
</SCHOOL>
'''

import xml.etree.ElementTree  as ET

e = ET.ElementTree(ET.fromstring(getunitinfo_str))

name = None # to remeber element

for elt in e.iter():
    if elt.tag == 'NAME':
        name = elt
    if elt.tag == 'STD':
       print("{}:{}".format(name.text, elt.text))

下面一班

import xml.etree.ElementTree as ET

xml = '''<SCHOOL>
    <GROUP name="GetStudInfo">
        <DATA>
            <NAME type="char">Sahil Jha</NAME>
            <STD>11th</STD>
        </DATA>
        <DATA>
            <NAME type="char">Rashmi Kaur</NAME>
            <STD>116th</STD>
        </DATA>
        <DATA>
            <NAME type="char">Palak Bisht</NAME>
            <STD>17th</STD>
        </DATA>
</GROUP>
</SCHOOL>'''

root = ET.fromstring(xml)
data = {x.find("NAME").text: x.find("STD").text for x in root.findall('.//DATA')}
print(data)

output

{'Sahil Jha': '11th', 'Rashmi Kaur': '116th', 'Palak Bisht': '17th'}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM