【问题标题】:Reading XML files with Petl使用 Petl 读取 XML 文件
【发布时间】:2019-02-23 03:49:55
【问题描述】:

我正在尝试将 XML 文件中的信息解析到已使用 Petl 从另一个 CSV 文件创建的表中,并且遇到了 fromxml() 函数的语法问题。

XML 文件包含:

    <Locations>
  <qld_location>
    <Suburb>Brisbane-Central</Suburb>
    <Lat>-27.46758</Lat>
    <Long>153.027892</Long>
  </qld_location>
  <qld_location>
    <Suburb>Robertson</Suburb>
    <Lat>-27.565733</Lat>
    <Long>153.057213</Long>
  </qld_location>
  <qld_location>
    <Suburb>Logan-Village</Suburb>
    <Lat>-27.767054</Lat>
    <Long>153.116881</Long>
  </qld_location>
</Locations>

我目前有一张桌子:

import petl as etl

table = (
        etl
            .fromcsv('QLD_Health_Care_Practices.csv')
            .convert('Practice_Name', 'upper')
            .convert('Suburb', str)
            .convert('State', str)
            .convert('Postcode', str)
    )

    +-----------------------------------+--------------------+-------+----------+
    | Practice_Name                     | Suburb             | State | Postcode |
    +===================================+====================+=======+==========+
    | 'BRISBANE CENTRE HEALTH SERVICES' | 'Brisbane-Central' | 'QLD' | '4000'   |
    +-----------------------------------+--------------------+-------+----------+
    | 'ROBERTSON FAMILY PRACTICE'       | 'Robertson'        | 'QLD' | '4109'   |
    +-----------------------------------+--------------------+-------+----------+
    | 'LOGAN VILLAGE CLINIC'            | 'Logan-Village'    | 'QLD' | '4207'   |
    +-----------------------------------+--------------------+-------+----------+
    | 'IPSWICH HEALTH CLINIC'           | 'Ipswich'          | 'QLD' | '4305'   |
    +-----------------------------------+--------------------+-------+----------+
    | 'CATTLE CREEK CLINIC'             | 'Cattle Creek'     | 'QLD' | '4407'   |
    +-----------------------------------+--------------------+-------+----------+

并希望在 XML 文件的新列中添加经度和纬度。

我正在尝试使用该功能:

table1= (etl.fromxml('QLD_Locations.xml', 'Locations', 'qld_location', 'Suburb', 'Lat', 'Long')

但我无法理解这种 XML 语法所需的参数。

任何帮助将不胜感激,在此先感谢。

【问题讨论】:

    标签: python python-3.x petl


    【解决方案1】:

    .fromxml() 的“扁平”参数列表仅在您还具有扁平类型的 XML 结构时才有效,其中所有数据列都具有相同的名称:

    <ROOT>
      <RECORD>
        <DATA /><DATA /><DATA /><DATA /><DATA />
      </RECORD>
    </ROOT>
    

    这可以提取为

    etl.fromxml('file.xml', 'RECORD', 'DATA')
    

    要从具有各种列名或嵌套的更复杂的结构中提取数据,例如:

    <ROOT>
      <RECORD>
        <A /><B /><C /><D /><E />
      </RECORD>
    </ROOT>
    

    在这里,您必须使用 dict 明确指定要提取的每一列:

    etl.fromxml('file.xml', 'RECORD', {
        'Column 1': 'A',
        'Column 2': 'B',
        'Column 3': 'C',
        'Column 4': 'D',
        'Column 5': 'E',
    })
    

    其中 'A'、'B'、'C' 等是相对于RECORD 的 XPath 表达式。

    【讨论】:

    • 好的理解,就我而言,我只需要 Lat 和 Long 两列,因为郊区已经订购了。我的文件中的根是&lt;Locations&gt;,记录是&lt;qld_location&gt;的每个实例我如何将数据从每个实例拉到各自的列中?
    • 我相信你可以自己解决这个问题。我没有故意创建“复制和粘贴”代码示例。
    • 我认为table2=( etl.fromxml('QLD_Locations.xml', 'qld_locations', { 'Lat': 'Lat', 'Long': 'Long', }) ) 应该给我第一组纬度和经度而没有任何错误是正确的吗?我对如何在 的多个实例之间工作感到很困惑
    • etl.fromxml() 调用已经为您提供了所有实例,您无需为此做任何特别的事情。 'qld_locations' 是什么?
    • 在您的回答中,&lt;ROOT&gt; &lt;RECORD&gt; &lt;A /&gt;&lt;B /&gt;&lt;C /&gt;&lt;D /&gt;&lt;E /&gt; &lt;/RECORD&gt; &lt;/ROOT&gt; 我的印象是 Record 与我文件中的 qld_location 相同。我不确定如何在我拥有的多个记录标签之间工作。
    猜你喜欢
    • 2018-09-18
    • 2012-09-09
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多