簡體   English   中英

使用元素樹python3解析XML文件

[英]Parsing XML file using element tree python3

我想解析下面給出的 XML 文件片段以提取視點標記及其屬性名稱。 我還想創建一個表來將提取的數據制成表格。

我的 XML 文件片段:

 <windows source-height='51'>
        <window class='dashboard' maximized='true' name='Figure 8-59'>
          <viewpoints>
            <viewpoint name='Good Filter Design'>
              <zoom type='entire-view' />
              <geo-search-visibility value='1' />
            </viewpoint>
            <viewpoint name='Poor Filter Design'>
              <zoom type='entire-view' />
              <geo-search-visibility value='1' />
            </viewpoint>
          </viewpoints>
          <active id='-1' />
        </window>
        <window class='dashboard' name='Figure 8-60 thought 8-65'>
          <viewpoints>
            <viewpoint name='Heat Map'>
              <zoom type='entire-view' />
              <geo-search-visibility value='1' />
            </viewpoint>
            <viewpoint name='Lightbulb'>
              <zoom type='entire-view' />
              <geo-search-visibility value='1' />
            </viewpoint>
            <viewpoint name='Sales Histogram'>
              <zoom type='entire-view' />
              <geo-search-visibility value='1' />
            </viewpoint>
          </viewpoints>
          <active id='-1' />
        </window>
</windows>

我想將"good filter design""poor filter design"提取並保留在一行中,並將其余三個視點名稱作為第二行。

我的嘗試:

root = getroot('example.xml')
for i in root.findall('windows/window/viewpoints/viewpoint'):
    print(i.get('name'))

使用 elementtree 應該很容易。 我不知道getroot()到底做了什么,但如果它真的返回 XML 文檔的根元素,那么你不應該在findall參數中提到window

>>> from xml.etree import ElementTree as ET
>>> raw = '''your XML string'''
>>> root = ET.fromstring(raw)
>>> for v in root.findall('window/viewpoints'):
...     print([a.get('name') for a in v.findall('viewpoint')])
... 
['Good Filter Design', 'Poor Filter Design']
['Heat Map', 'Lightbulb', 'Sales Histogram']

demo

如果你可以很容易地使用beautifulsoup,那就是

from bs4 import BeautifulSoup
#xml = """your xml"""
soup = BeautifulSoup(xml, 'lxml')
names = [viewpt["name"] for viewpt in soup.find_all('viewpoint')]

這將給每個名為“viewpoint”的標簽

如果你只想嵌套一個使用這個:

names = [viewpoint["name"]
        for windows in soup.find_all('windows')
            for window in windows.find_all("window")
                for viewpoints in window.find_all("viewpoints")
                    for viewpoint in viewpoints.find_all("viewpoint")]

在你的情況下,兩者都會給出:

Out[18]: 
['Good Filter Design',
 'Poor Filter Design',
 'Heat Map',
 'Lightbulb',
 'Sales Histogram']

暫無
暫無

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

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