【发布时间】:2017-11-23 10:34:35
【问题描述】:
我正在尝试从 XML 文件中提取信息并将其转换为以下 XML 结构的 pandas 数据框:
<change user="123" timestamp="2017-09-04T13:58:46.190Z">
<log id="333" action="create">
<property id="52122">
<old/>
<new>
<item id="562622" toString="Test"/>
<item id="033362" toString="Test2"/>
</new>
</property>
<property id="33563">
<new>
<item id="44322" toString="Test3"/>
</new>
</property>
<property id="21733">
<old/>
<new id="12341212" toString="Test4"/>
</property>
</log>
</change>
以下是数据框中列的预期标题:
Change_User|Timestamp|Log_id|Action|property_ID|New_Property_ID|Item_ID|To_String
我之前用 MiniDom 尝试过,但是太糟糕了。现在我正在尝试使用 xml-elementree。
我如何编写代码以循环遍历整个更改元素,直到 item-id 没有重复?
我需要这样的东西:
for test in root.iter('change'):
change_user_id.append(test.attrib['user'])
timestamp.append(test.attrib['timestamp'])
for log in test:
log_id.append(log.attrib['id'])
action.append(log.attrib['action'])
#now comes the part where i get duplicates and wrong order of the following values...
#after some logic...
d = {'changer_user':change_user_id,'timestamp':timestamp,'log_id':log_id,'action':action#and so on...}
a = pd.DataFrame.from_dict(d, orient='index')
【问题讨论】:
-
为什么
new的id和toString属性出现在第三个property中,而前两个却没有(而不是item的属性)? -
我编辑结束标签以进行更改,是的,这就是我遇到的一些问题。它是带有其他值的原始文件。所以这不是一个错误。
-
为什么
<old/>(empty) 在第二个中没有,而在其他两个中没有? -
因为系统中没有“旧”信息放在这里。此 XML 文件表示在系统中创建新对象。
-
我认为我需要一个 4 或 5 级循环来捕获所有值,并检查 old-tag 是否为空。
标签: python xml elementtree