Разобрать XML файл в Python объект ..? - PullRequest
0 голосов
/ 26 февраля 2020

Я пытался это сделать, но не понял, как это сделать, это мой xml .file

<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
    <record name ="Collection Report" id="view_collection_report_tree" model="cl.wastemanager.collection.report">
        <field name="description">Collection Report Tree</field>
        <field name="model">ir.ui.view</field>
        <field name="arch" type="xml">
            <tree string="Collection Analysis">
                <field name="hospital_no" type="string"/>
                <field name="partner_id" type="integer"/>
                <field name="district" type="string"/>
                <field name="town" type="string"/>
                <field name="date" type="string"/>
                <field name="cat1_uom_count" type="integer"/>
                <field name="cat1_uom_qty" type="float"/>
                <field name="cat2_uom_count" type="integer"/>
                <field name="cat2_uom_qty" type="float"/>
                <field name="cat3_uom_count" type="integer"/>
                <field name="cat3_uom_qty" type="float"/>
                <field name="cat4_uom_count" type="integer"/>
                <field name="cat4_uom_qty" type="float"/>
                <field name="cat5_uom_count" type="integer"/>
                <field name="cat5_uom_qty" type="float"/>
                <field name="total_uom_count" type="integer"/>
                <field name="total_uom_qty" type="float"/>
                <field name="plant_id" type="integer"/>
                <field name="vehicle_id" type="integer"/>
            </tree>
        </field>
    </record>

</data>
</openerp>

Я хочу прочитать его в объект python, что-то вроде списка словари. Поскольку разметка абсолютно исправлена, я испытываю желание использовать регулярные выражения (я довольно хорошо их использую). Тем не менее, я подумал, что я проверю, если кто-то знает, как легко избежать регулярных выражений здесь. У меня нет большого опыта работы с SAX или другим анализом, но я готов учиться.

Я с нетерпением жду возможности показать, как это делается быстро без регулярных выражений в Python. Спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Это то, что я попробовал от себя, используя pandas, и я могу правильно получить вывод.

import pandas as pd
import xml.etree.ElementTree as etree

tree = etree.parse("Filename.xml") #enter your filename what you saved in your system

root = tree.getroot()

columns = ["name", "type"]

datatframe = pd.DataFrame(columns = columns)

for node in root[0][0][2][0]:

    name = node.get("name")

    type = node.get("type")

    datatframe = datatframe.append(pd.Series([name, type], index = columns), ignore_index = True)

print(datatframe)

Myoutput:

               name     type
0       hospital_no   string
1        partner_id  integer
2          district   string
3              town   string
4              date   string
5    cat1_uom_count  integer
6      cat1_uom_qty    float
7    cat2_uom_count  integer
8      cat2_uom_qty    float
9    cat3_uom_count  integer
10     cat3_uom_qty    float
11   cat4_uom_count  integer
12     cat4_uom_qty    float
13   cat5_uom_count  integer
14     cat5_uom_qty    float
15  total_uom_count  integer
16    total_uom_qty    float
17         plant_id  integer
18       vehicle_id  integer
0 голосов
/ 26 февраля 2020

вы действительно не заявляете, чего хотите достичь, но ниже приведен пример извлечения данных из xml, в этом случае я извлекаю имя и тип поля из полей внутри элемента дерева.

import xmltodict
with open("test.xml") as xml_file:
    my_xml = xmltodict.parse(xml_file.read())
    for field in my_xml["openerp"]["data"]["record"]["field"][2]["tree"]["field"]:
        print(f"{field['@name']}: {field['@type']}")

ВЫХОД

hospital_no: string
partner_id: integer
district: string
town: string
date: string
cat1_uom_count: integer
cat1_uom_qty: float
cat2_uom_count: integer
cat2_uom_qty: float
cat3_uom_count: integer
cat3_uom_qty: float
cat4_uom_count: integer
cat4_uom_qty: float
cat5_uom_count: integer
cat5_uom_qty: float
total_uom_count: integer
total_uom_qty: float
plant_id: integer
vehicle_id: integer
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...