XML 元素树 Python 遍历子项并将每个子项保存为 CSV 列
XML Element Tree Python Iterate through child and save each subchild as CSV column
我一直在搜索所有 SO 来解决我当前的问题,但未能找到任何能够充分解决它的方法。我正在尝试遍历 XML 文档中根节点的子节点,并在迭代中提取每个子节点的值(例如,在下面的 XML 中遍历并提取 COMPANY 的每个实例和角色)。这是一个巨大项目的最后一部分,我完全陷入困境,我们将不胜感激任何和所有帮助。
<Personnel Personnel ID = "123">
<First_Name> First </First_Name>
<Last_Name> Last </Last_Name>
<User_ID> 123 </User_ID>
<Date> 2017-01-01 </Date>
<INFO>
<INFO_1>
<PHONE> 555-555-5555 </PHONE>
<INFO_2>
<EMAIL> name@email.com </EMAIL>
</INFO>
<LINKS>
<LINK COMPANY = "Company 1" ROLE = "Role 1" />
<LINK COMPANY = "Company 2" ROLE = "Role 2" />
<LINK COMPANY = "Company 3" ROLE = "Role 3" />
....
<LINK Company = "Company n" ROLE = "Role n" />
</LINKS>
<TAGS>
<TAG Term="Tag 1" />
<TAG Term="Tag 2" />
<TAG Term="Tag 3" />
...................
<TAG Term="Tag n" />
</Tags>
<Personnel_Field_1> Field 1 </Personnel_Field_1>
<Personnel_Field_2> Field 2 </Personnel_Field_2>
示例代码:
for contact in root.findall('Personnel'):
Personnel_ID = contact.get('Personnel_ID')
contact_info.append(Personnel_ID)
First_Name = contact.find('First_Name').text
contact_info.append(First_Name)
Last_Name = contact.find('Last_Name').text
contact_info.append(Last_Name)
User = contact.find('User_ID').text
contact_info.append(User)
Date = contact.find('Date').text
contact_info.append(Date)
Email = contact.find( './/EMAIL' ).text
contact_info.append(Email)
Phone = contact.find( './/PHONE' ).text
contact_info.append(Phone)
Personnel_1 = contact.find('Personnel_Field_1').text.encode('utf-8')
contact_info.append(Personnel_1)
Personnel_2 = contact.find('Personnel_Field_2').text.encode('utf-8')
contact_info.append(Personnel_2)
到目前为止,我已成功提取以下内容并将它们保存到 CSV 列中:人员 ID、名字、姓氏、用户 ID、日期、电子邮件、Phone、人员 1、人员 2
我坚持的是迭代解析 COMPANY 和 ROLE 以及解析每个术语的能力。我还需要将每个公司、角色和标记值保存为它们自己的列。如果有人可以通过简单地向我展示如何遍历这些元素来提供帮助,我将能够将它们保存到 CSV 列中。
在此先感谢您提供的所有建议,这是我正在进行的一个巨大项目的最后一部分,我觉得我已经用尽了我找到的所有可能的解决方案。
只需添加嵌套的 for
循环来解析 LINK 和 TAG 子项。
for contact in root.findall('Personnel'):
...
for link in contact.findall('.//LINK'):
contact_info.append(link.get('COMPANY'))
contact_info.append(link.get('ROLE'))
for tag in contact.findall('.//TAG'):
contact_info.append(tag.get('Term'))
我一直在搜索所有 SO 来解决我当前的问题,但未能找到任何能够充分解决它的方法。我正在尝试遍历 XML 文档中根节点的子节点,并在迭代中提取每个子节点的值(例如,在下面的 XML 中遍历并提取 COMPANY 的每个实例和角色)。这是一个巨大项目的最后一部分,我完全陷入困境,我们将不胜感激任何和所有帮助。
<Personnel Personnel ID = "123">
<First_Name> First </First_Name>
<Last_Name> Last </Last_Name>
<User_ID> 123 </User_ID>
<Date> 2017-01-01 </Date>
<INFO>
<INFO_1>
<PHONE> 555-555-5555 </PHONE>
<INFO_2>
<EMAIL> name@email.com </EMAIL>
</INFO>
<LINKS>
<LINK COMPANY = "Company 1" ROLE = "Role 1" />
<LINK COMPANY = "Company 2" ROLE = "Role 2" />
<LINK COMPANY = "Company 3" ROLE = "Role 3" />
....
<LINK Company = "Company n" ROLE = "Role n" />
</LINKS>
<TAGS>
<TAG Term="Tag 1" />
<TAG Term="Tag 2" />
<TAG Term="Tag 3" />
...................
<TAG Term="Tag n" />
</Tags>
<Personnel_Field_1> Field 1 </Personnel_Field_1>
<Personnel_Field_2> Field 2 </Personnel_Field_2>
示例代码:
for contact in root.findall('Personnel'):
Personnel_ID = contact.get('Personnel_ID')
contact_info.append(Personnel_ID)
First_Name = contact.find('First_Name').text
contact_info.append(First_Name)
Last_Name = contact.find('Last_Name').text
contact_info.append(Last_Name)
User = contact.find('User_ID').text
contact_info.append(User)
Date = contact.find('Date').text
contact_info.append(Date)
Email = contact.find( './/EMAIL' ).text
contact_info.append(Email)
Phone = contact.find( './/PHONE' ).text
contact_info.append(Phone)
Personnel_1 = contact.find('Personnel_Field_1').text.encode('utf-8')
contact_info.append(Personnel_1)
Personnel_2 = contact.find('Personnel_Field_2').text.encode('utf-8')
contact_info.append(Personnel_2)
到目前为止,我已成功提取以下内容并将它们保存到 CSV 列中:人员 ID、名字、姓氏、用户 ID、日期、电子邮件、Phone、人员 1、人员 2
我坚持的是迭代解析 COMPANY 和 ROLE 以及解析每个术语的能力。我还需要将每个公司、角色和标记值保存为它们自己的列。如果有人可以通过简单地向我展示如何遍历这些元素来提供帮助,我将能够将它们保存到 CSV 列中。
在此先感谢您提供的所有建议,这是我正在进行的一个巨大项目的最后一部分,我觉得我已经用尽了我找到的所有可能的解决方案。
只需添加嵌套的 for
循环来解析 LINK 和 TAG 子项。
for contact in root.findall('Personnel'):
...
for link in contact.findall('.//LINK'):
contact_info.append(link.get('COMPANY'))
contact_info.append(link.get('ROLE'))
for tag in contact.findall('.//TAG'):
contact_info.append(tag.get('Term'))