【问题标题】:xml elements in elements to python dataframe元素中的xml元素到python数据框
【发布时间】:2022-01-25 04:02:33
【问题描述】:

我正在尝试将 xml 数据转换为 pandas 数据框。 我正在苦苦挣扎的是我无法获取元素中的元素。

这是我的 xml 文件的示例。

我正在尝试提取的信息

-orth :"减少"

-cre_date:2013/12/07

-morph_grp -> 变种类型:“死亡”

-subsense - 例如:“abcdabcdabcd.”


<superEntry>
    <orth>decrease</orth>
    <entry n="1" pos="vk">
        <mnt_grp>
            <cre>
                <cre_date>2013/12/07</cre_date>
                <cre_writer>james</cre_writer>
                <cre_writer>jen</cre_writer>
            </cre>
            <mod>
                <mod_date>2007/04/14</mod_date>
                <mod_writer>kim</mod_writer>
                <mod_note>edited ver</mod_note>
            </mod>
            <mod>
                <mod_date>2009/11/01</mod_date>
                <mod_writer>kim</mod_writer>
                <mod_note>edited</mod_note>
            </mod>
        </mnt_grp>
        <morph_grp>
            <var type="spr">decease</var>
            <cntr opt="opt" type="oi"/>
            <org lg="si">decrease_</org>
            <infl type="reg"/>
        </morph_grp>
        <sense n="01">
            <sem_grp>
                <sem_class>active solution</sem_class>
                <trans>be added and subtracted to</trans>
            </sem_grp>
            <frame_grp type="FIN">
                <frame>X=N0-i Y=N1-e V</frame>
                <subsense>
                    <sel_rst arg="X" tht="THM">countable</sel_rst>
                    <sel_rst arg="Y" tht="GOL">countable</sel_rst>
                    <eg>abcdabcdabcd.</eg>
                    <eg>abcdabcdabcd.</eg>
                </subsense>

我正在使用代码

df_cols=["orth","cre_Date","var type","eg"]
row=[]
  
for node in xroot:
  a=node.attrib.get("sense")
  b=node.attrib.get("orth").text if node is not None else None
  c=node.attrib.get("var type").text if node is not None else None
  d=node.attrib.get("eg").text if node is not None else None
  
  rows.append({"orth":a, "entry":b,
               "morph_grp":c, "eg" : d})
  
 out_df= pd.DataFrame(rows,colums=df_cols) 

我一直坚持将元素放入元素中 有什么好的解决方案吗? 提前非常感谢你

【问题讨论】:

  • 请包含所有import 行以了解您的工作模块。
  • 发布一个 VALID xml 文档并展示 DF 的样子。

标签: python pandas xml


【解决方案1】:

对你想要什么做一些假设,这是一种使用 XPath 的方法。

我假设您将遍历多个 XML 文件,每个文件都有一个 superEntry 根节点,以便生成包含多个记录的 DataFrame。 或者,也许您的实际 XML 文档在 superEntry 之上有一个更高级别的根/父元素,您将在其中迭代多个 superEntry 元素。 您需要相应地修改以下内容以添加您的循环。

此外,提供的示例 XML 有两个具有相同值的“eg”元素。不知道你想如何处理。下面只会得到第一个。如果两者都需要处理,那么可以使用 findall() 方法代替 find()。

我对您想要从“var”元素中得到什么感到有些困惑。您指定了“var type”,但您希望该值是“已故”,这是“var”元素中的文本,而“type”是一个值为“spr”的属性。我假设你想要的是文本而不是属性值。

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

df_cols = ["orth","cre_Date","var","eg"]
data = []

xmlDocPath = "example.xml"
tree = ET.parse(xmlDocPath)
superEntry = tree.getroot()

#Below XPaths will just get the first occurence of these elements:
orth = superEntry.find("./orth").text
cre_Date = superEntry.find("./entry/mnt_grp/cre/cre_date").text
var = superEntry.find("./entry/morph_grp/var").text
eg = superEntry.find("./entry/sense/frame_grp/subsense/eg").text 

data.append({"orth":orth, "cre_Date":cre_Date, "var":var, "eg":eg})

#After exiting Loop, create DataFrame:
df = pd.DataFrame(data, columns=df_cols)
df.head()

输出:

    orth    cre_Date    var eg
0   decrease    2013/12/07  decease abcdabcdabcd.

这里是 XPath 使用的 ElementTree 文档的链接:https://docs.python.org/3/library/xml.etree.elementtree.html#xpath-support

【讨论】:

    猜你喜欢
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    相关资源
    最近更新 更多