我有一大堆大型XML文件,其中包含数千条如下所示的记录:
XML示例:
<Report:Report xmlns:Report ="http://someplace.com">
<Id root="1234567890"/>
<Records value="10"/>
<ReportDate>2020-06-20</ReportDate>
<Record>
<Id root="001"/>
<Site>
<SiteData>
<SiteDataInfo1>
<Name code="12345"/>
<Status code="1"/>
</SiteDataInfo1>
<SiteDataInfo2>
<Primary code="A"/>
<Secondary code="B"/>
</SiteDataInfo2>
</SiteData>
</Site>
</Record>
<Record>
<Id root="002"/>
<Site>
<SiteData>
<SiteDataInfo1>
<Name code="789AB"/>
<Status code="2"/>
</SiteDataInfo1>
<SiteDataInfo2>
<Secondary code="D"/>
</SiteDataInfo2>
</SiteData>
</Site>
</Record>
<Record>
<Id root="003"/>
<Site>
<SiteData>
<SiteDataInfo1>
<Name code="CDEFG"/>
</SiteDataInfo1>
<SiteDataInfo2>
<Primary code="E"/>
</SiteDataInfo2>
</SiteData>
</Site>
</Record>
</Report:Report>
原始文件在每个记录元素下有数百个不同深度的子元素,因此我在这里对其进行了一些简化,同时仍然保留了核心问题。我的目标是将XML读入pandas数据框架,这样我就可以处理如下内容:
Record Id | Number | Status | Primary | Secondary
-------------------------------------------------
001 | 12345 | 1 | A | B
-------------------------------------------------
002 | 789AB | 2 | | D
-------------------------------------------------
003 | CDEFG | | E |
正如您所看到的,大多数数据都有五个级别,并且不是每个元素都存在于每个记录中,但是我需要能够处理缺少的元素,如上表所示
我已经开始玩lxml,但我真的不知道我在做什么!我知道我可以(非常笨拙地)通过遍历树来提取属性或文本,如下所示:
from lxml import etree as et
xtree = et.parse('file1.xml')
xroot = xtree.getroot()
for n in xroot.iter('Primary'):
print(n.attrib['code'])
但是。。。在这之后,我已经失去了动力。我不确定如何继续并构造代码,以便确保任何转换的数据实际上都与它的原始记录对应
任何善良的灵魂都能指引我走出黑暗的XML山谷,走向阳光普照的熊猫山吗
任何帮助都将不胜感激
我通常的方法是使用xmlplain,然后使用json_normalize
so.xml只是保存到文件中的示例xml
输出
见下文
相关问题 更多 >
编程相关推荐