簡體   English   中英

使用 Python 的命名空間解析 XML 文件

[英]Parse XML file with namespace with Python

我有一個復雜的 xml 我正在嘗試從中提取數據。

<?xml version="1.0" ?>
<root xmlns="something.something.com">
    <Save>
        <AdditionalInfo>
            <Name></Name>
            <Time></Time>
            <UtilityVersion></UtilityVersion>
            <XMLVersion></XMLVersion>
            <PluginName></PluginName>
            <ClassName></ClassName>
        </AdditionalInfo>
        <Data>
            <session>
                <xyDataObjects>
                    <xyData Key="'info'" ObjectType="moreinfo" Type="evenmoreinfo">
                        <axis1QuantityType ObjectType="guesswhat" Type="info!">
                            <label></label>
                            <type></type>
                        </axis1QuantityType>
    ... and so on and so on

該文件有多個以 Save 和 /Save 塊開頭和結尾的塊,我要查找的信息可以遠至 label,甚至更遠。

ElementTree.Iter 似乎是我的解決方案,因為它會遍歷每個 Save 塊並找到我正在尋找的<label>信息,但不幸的是,它不接受命名空間參數。

我的其他選擇是什么? 我試圖保持我的代碼靈活,因為我預見到 xml 文件的結構將來可能會改變,而且很簡單,所以我寧願不實現類似的東西:

tree= ET.parse('dblank.xml')
root = tree.getroot()
for i in range(len(root)):
        Array[i]=root[i][1][0][0][0][0][0].text

當您使用命名空間處理 XML 時,您必須指定使用的命名空間。 為此,我:

  • 定義ns變量(字典),命名空間快捷方式作為鍵,完整命名空間作為值(此處為單個字典條目),
  • 將此變量用作findall中的第二個參數。

另請注意, findall的第一個參數包含一些:作為元素名稱的初始部分。

試試下面的代碼:

import xml.etree.ElementTree as et

tree = et.parse('Input.xml')
root = tree.getroot()
ns = {'some': 'something.something.com'}

for elem in root.findall('.//some:label', ns):
    print(elem.text)

當然,這只是如何引用現有元素的示例。 根據您的需要進行更改。

暫無
暫無

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

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