簡體   English   中英

使用 ElementTree 按順序解析某些 XML 標簽

[英]Parse certain XML tags sequentially using ElementTree

我試圖以順序方式解析 XML 文件,只考慮感興趣的 XML 標簽。 下面顯示了一個示例 XML 文件(存儲為file.xml )。 我只對已知路徑的某些 XML 標簽感興趣,如下面的 Python 代碼片段所示(例如header/para/paratextbody/section/intro/text )。 不同的 XML 文件可能有不同的標簽順序,所以我不想規定我已知的 XML 標簽出現的順序。 任何建議如何以有效的方式執行此操作而不必遍歷整個 XML 文件?

XML文件

<data>
  <header>
    <para>
      <paratext>0 - extract this</paratext>
    </para>
  </header>
  <body>
    <section>
      <intro>
        <text>1 - extract this</text>
      </intro>
      <para>
        <paratext>2 - extract this</paratext>
      </para>
      <items>
        <paratext>do not extract this</paratext>
        <part>
          <para>
            <paratext>3 - extract this</paratext>
          </para>
        </part>
      </items>
    </section>
    <section>
      <text>do not extract this</text>
      <intro>
        <text>4 - extract this</text>
      </intro>
      <para>
        <paratext>5 - extract this</paratext>
      </para>
      <para>
        <paratext>6 - extract this</paratext>
      </para>
    </section>
  </body>
</data>

所需的輸出['0 - extract this', '1 - extract this', '2 - extract this', '3 - extract this', '4 - extract this', '5 - extract this', '6 - extract this']

示例 Python 腳本

import xml.etree.ElementTree as ET

tree = ET.parse('file.xml')
root = tree.getroot()

### Paths I would like to extract (but sequentially)
[i.text for i in root.findall('header/para/paratext')]
# ['0 - extract this']
[i.text for i in root.findall('body/section/intro/text')]
# ['1 - extract this', '4 - extract this']
[i.text for i in root.findall('body/section/para/paratext')]
# ['2 - extract this', '5 - extract this', '6 - extract this']
[i.text for i in root.findall('body/section/items/part/para/paratext')]
# ['3 - extract this']

我認為最好的方法是在 XPath 中使用聯合運算符(“ | ”) 這將按文檔順序選擇所需的元素。

不幸的是,ElementTree 對XPath 的支持有限

如果你可以使用 lxml,它有更好的 XPath 支持

例子...

Python

from lxml import etree

tree = etree.parse("file.xml")

print([i.text for i in tree.xpath('header/para/paratext|'
                                  'body/section/intro/text|'
                                  'body/section/para/paratext|'
                                  'body/section/items/part/para/paratext')])

打印輸出

['0 - extract this', '1 - extract this', '2 - extract this', '3 - extract this', '4 - extract this', '5 - extract this', '6 - extract this']

暫無
暫無

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

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