【发布时间】:2018-01-09 17:05:43
【问题描述】:
您好,我可以将我的 xml 文件转换为 pandas 数据框。但我面临的挑战是我没有在正确的行中获取记录,假设我们在 xml 中有一组标签,例如,这些标签正在重复。 4 次,它有多个子节点,这些子节点应该是我的数据框的列,现在当我尝试读取 xml 时,我只想在我的 pandas 数据框中获得 4 行,但我用 NaN 获得了太多行,因为所有其他标签位于不同的层次。
编辑:刚刚弄清楚 XML 数据中的描述/差异。提到的一个是最终编辑的xml数据 只需找出我的 XML 数据的一些问题......更新了正确和最终的 xml 内容。
Same <ns1:parenttag> is getting repeated over a xml file multiple times
<?xml version="1.0" encoding="UTF-8"?>
<row:user-agents xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:row="http://www.row.com"
xmlns:ns1="http://www.ns1.com"
xmlns:ns2="http://www.ns2.com"
xmlns:ns3="http://www.ns3.com"
xmlns:row1="http://www.row1.com"
xmlns:row3="http://www.row3.com"
xmlns:row2="http://www.row2.com"
xsi:schemaLocation="http://www.schemaLocation-1.4.xsd">
<row:agent1>
<row:test>
<row2:test1>
<row2:test2>
<row2:test3>9999</row2:test3>
<row2:test4>aa</row2:test4>
<row2:test5>1</row2:test5>
</row2:test2>
</row2:test1>
<row2:test6>2017</row2:test6>
</row:test>
<row:agent2>
<row3:agent3>
<ns1:parenttag>
<ns1:childtag1>
<ns1:subchildtag1>
<ns1:indenticaltag>123</ns1:indenticaltag>
</ns1:subchildtag1>
</ns1:childtag1>
<ns1:indenticaltag>456</ns1:indenticaltag>
<ns1:childtag2>N</ns1:childtag2>
<ns1:childtag3>0</ns1:childtag3>
<ns1:childtag4>N</ns1:childtag4>
<ns1:childtag5>
<ns2:subchildtag2 attributname="abc">
<ns2:sub_subchildtag1>12 45</ns2:sub_subchildtag1>
</ns2:subchildtag2>
</ns1:childtag5>
<ns1:childtag6>tyu</ns1:childtag6>
<ns1:childtag7>2</ns1:childtag7>
<ns1:childtag8> poiu</ns1:childtag8>
<ns1:childtag9>
<ns3:subchildtag3>345</ns3:subchildtag3>
<ns3:subchildtag6>567</ns3:subchildtag6>
</ns1:childtag9>
<ns1:childtag10>N</ns1:childtag10>
<ns1:childtag11>
<ns3:subchildtag4>34</ns3:subchildtag4>
<ns3:subchildtag5>abc/123</ns3:subchildtag5>
</ns1:childtag11>
<ns1:childtag12>
<ns1:indenticaltag>234</ns1:indenticaltag>
</ns1:childtag12>
</ns1:parenttag>
</row3:agent3>
</row:agent2>
</row:agent1>
</row:user-agents>
另一个在父标签方面有点不同的 XML:
<ns1:parenttag>
<ns1:indenticaltag>123</ns1:indenticaltag>
<ns1:childtag2>N</ns1:childtag2>
<ns1:childtag3>0</ns1:childtag3>
<ns1:childtag4>N</ns1:childtag4>
<ns1:childtag5>
<ns2:subchildtag1 attributename0="poi">
<ns2:sub_subchildtag1>
<ns2:sub_sub_subchildtag1>
<ns2:sub_sub_sub_subchildtag1 attributename1="3" attributename2="17">1234</ns2:sub_sub_sub_subchildtag1>
</ns2:sub_sub_subchildtag1>
</ns2:sub_subchildtag1>
</ns2:subchildtag1>
</ns1:childtag5>
<ns1:childtag6>12</ns1:childtag6>
<ns1:childtag7> qwer</ns1:childtag7>
<ns1:childtag8>
<ns3:subchildtag2>456</ns3:subchildtag2>
</ns1:childtag8>
<ns1:childtag9>N</ns1:childtag9>
<ns1:childtag10>
<ns3:subchildtag3>908</ns3:subchildtag3>
<ns3:subchildtag4>abc/123</ns3:subchildtag4>
</ns1:childtag10>
</ns1:parenttag>
我正在使用 Parfait 在以下答案中建议的功能: 但收到此错误:
i am getting ValueError: Length mismatch: Expected axis has 21 elements, new values have 22 elements erros
Also it has issue with indenticaltag column as its of same name thrice but hierarchy is different
but in dataframe i am getting only one indenticaltag column instead of 3 for example:
parent.child.indenticaltag, parent.child.subchild.indenticaltag and parent.child.subchild.sub_subchild.indenticaltag etc.
输出数据框为:
I will parse both xmls differently using one function only.
Would like to parse all the tags and their attribute as column name in
pandas. Also the column name should be
parent.child.subchild.sub_sub_subchildtag and for attributes it should
be parent.child.subchild.sub_sub_childtag.attribute
他们有更好的方法来解析 xml 并以正确的格式获取记录吗?还是我错过了什么?
编辑:解决方案有效,但增加了一些复杂性
I need your help for three points if you guys can suggest some pointers:
1) I need columns name for pandas dataframe as root.child.subchild.grandchild i am not sure how i can get it here ? as in my solution i was able to get.
2) the descendant function is very slow is any way we can speed it up ?
3) i have to multiple xml of same type present in one directory and i would like to generate one dataframe out of it by appending all xml results any best way to do ?
【问题讨论】: