【问题标题】:XML to table form in ExcelXML 到 Excel 中的表格形式
【发布时间】:2019-11-13 15:03:38
【问题描述】:

使用 Excel 打开 xml 文件时有此选项。如图Here

所示,系统会提示您选择选项

它基本上是根据我所做的分析在表格中打开该 xml 文件。它似乎做得很好。 这是我使用 excel 作为表格形式打开 xml 文件后的样子 Here

我的问题:我想将 Xml 转换为表格,就像 Excel 中的那个功能一样。这可能吗?

我想要这个结果的原因是,使用 pandas 之类的库非常容易在 excel 中处理表格。但是,我不想用 excel 打开每个 xml 文件,显示表格然后再次保存。这不是很省时

这是我的 XML 文件

   <?xml version="1.0" encoding="utf-8"?>
<ProjectData>
<FINAL>
    <START id="ID0001" service_code="0x5196">
      <Docs Docs_type="START">
        <Rational>225196</Rational>
        <Qualify>6251960000A0DE</Qualify>
      </Docs>
      <Description num="1213f2312">The parameter</Description>
      <SetFile dg="" dg_id="">
        <SetData value="32" />
      </SetFile>
    </START>
    <START id="DG0003" service_code="0x517B">
      <Docs Docs_type="START">
        <Rational>23423</Rational>
        <Qualify>342342</Qualify>
      </Docs>
      <Description num="3423423f3423">The third</Description>
      <SetFile dg="" dg_id="">
        <FileX dg="" axis_pts="2" name="" num="" dg_id="" />
        <FileY unit="" axis_pts="20" name="TOOLS" text_id="23423" unit_id="" />
        <SetData x="E1" value="21259" />
        <SetData x="E2" value="0" />
      </SetFile>
    </START>
    <START id="ID0048" service_code="0x5198">
      <RawData rawdata_type="OPDATA">
        <Request>225198</Request>
        <Response>343243324234234</Response>
      </RawData>
      <Meaning text_id="434234234">The forth</Meaning>
      <ValueDataset unit="m" unit_id="FEDS">
        <FileX dg="kg" discrete="false" axis_pts="19" name="weight" text_id="SDF3" unit_id="SDGFDS" />
        <SetData xin="sdf" xax="233" value="323" />
        <SetData xin="123" xax="213" value="232" />
        <SetData xin="2321" xax="232" value="23" />
      </ValueDataset>
    </START>
</FINAL>
</ProjectData>

【问题讨论】:

  • 你想把 XML 转换成 panda 的数据框吗?见stackoverflow.com/q/28259301/5184851
  • 如果您想直接从 XML 转换为 csv,请参阅stackoverflow.com/a/52307498/5184851
  • 如果我想将 XML 转换为 pandas 的数据框但不删除属性的标签怎么办?为什么这样?因为我的 xml 文件略有不同,而且我不想每次将 xml 转换为 pandas 数据帧时都更改代码

标签: python xml pandas dataframe


【解决方案1】:

假设我有以下input.xml 文件:

<main>
    <item name="item1" image="a"></item>
    <item name="item2" image="b"></item>
    <item name="item3" image="c"></item>
    <item name="item4" image="d"></item>
</main>

您可以使用以下代码:

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

tree  = ET.parse('input.xml')
tags = [ e.attrib for e in tree.getroot() ] 
df = pd.DataFrame(tags)

# df: 
#     name image
# 0  item1     a
# 1  item2     b
# 2  item3     c
# 3  item4     d

这应该与给定文件中的属性数量无关。

要从 pandas 写入一个简单的 CSV 文件,您可以使用 to_csv 命令。见documentation。如果需要做excel表格,可以使用to_excel,见here

# Write to csv without the row names
df.to_csv('file_name.csv', index = False)

# Write to xlsx sheet without the row names
df.to_excel('file_name.xlsx', index=False)

更新:

对于您的 XML 文件,根据您在 cmets 中的说明,我建议如下,树中第一级的所有元素都是行,每个属性或节点文本都是列:

def has_children(e):
    ''' Check if element, e, has children'''
    return(len(list(e)) > 0)

def has_attrib(e):
    ''' Check if element, e, has attributes'''
    return(len(e.attrib)>0)

def get_uniqe_key(mydict, key):
    ''' Generate unique key if already exists in mydict'''
    if key in mydict:
        while key in mydict:
            key = key + '*'

    return(key)

tree = ET.parse('input2.xml')

root = tree.getroot()

# Get first level:
lvl_one = list(root)

myList = [];
for e in lvl_one:

    mydict  = {}
    # Iterate over each node in level one element
    for node in e.iter():

        if (not has_children(node)) & (node.text != None):
            uniqe_key = get_uniqe_key(mydict, node.tag)
            mydict[uniqe_key] = node.text

        if has_attrib(node):
            for key in node.attrib:
                uniqe_key = get_uniqe_key(mydict, key)
                mydict[uniqe_key] = node.attrib[key]

    myList.append(mydict)

print(pd.DataFrame(myList))  

注意,在这段代码中,我检查每个键的列名是否存在,如果存在,我创建一个新的列名,后缀为“*”。

【讨论】:

  • 代码运行成功但没有任何显示
  • 你试过print(df)吗?
  • 我做了,但我寻求帮助,了解如何将它们也放入 excel 表中
  • 我尝试将代码与我自己的 xml 代码一起使用。我得到空数据框,列:[],索引:[0,1,2]。我在上面添加了我的 xml 文件。目标是让它进入 Start 并打印它们的元素,然后它进入“DATAS”,然后打印它的元素,与“DOS”相同。如果元素没有任何内容,请在只写无的数据框中将其留空
  • 一个表会有列和行。对于给定的 XML,数据框应该是什么样子? XML 示例中提供的所有信息是否都在一行中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
相关资源
最近更新 更多