python-3.x - 修改包含多个 XML 文件的大文件以根据条件创建小文件
问题描述
我有一个大文件,其中包含不同行中的多个 XML。我想根据多个标签匹配电子表格列的条件创建一个带有行(或 XML)的新文件。例如,我有一个很大的 XML 文件。
<?xml version="1.0" encoding="UTF-8"?><data><student><result><grade>A</grade></result><details><name>John</name><house>Red</house><id>100</id><age>16</age><email>john@mail.com</email></details></student></data>
<?xml version="1.0" encoding="UTF-8"?><data><student><result><grade>B</grade></result><details><name>Alice</name><house>Blue</house><id>101</id><age>17</age><email>alice@mail.com</email></details></student></data>
<?xml version="1.0" encoding="UTF-8"?><data><student><result><grade>F</grade></result><details><name>Bob</name><house>Blue</house><id>100</id><age>16</age><email>bob@mail.com</email></details></student></data>
<?xml version="1.0" encoding="UTF-8"?><data><student><result><grade>A</grade></result><details><name>Hannah</name><house>Blue</house><id>103</id><age>17</age><email>hannah@mail.com</email></details></student></data>
<?xml version="1.0" encoding="UTF-8"?><data><student><result><grade>C</grade></result><details><name>James</name><house>Red</house><id>101</id><age>18</age><email>james@mail.com</email></details></student></data>
我需要创建一个文件,其中从 xlsx 文件中选择房屋和 id,如下所示:
并创建一个新文件,如下所示:
<?xml version="1.0" encoding="UTF-8"?><data><student><result><grade>F</grade></result><details><name>Bob</name><house>Blue</house><id>100</id><age>16</age><email>bob@mail.com</email></details></student></data>
<?xml version="1.0" encoding="UTF-8"?><data><student><result><grade>A</grade></result><details><name>Hannah</name><house>Blue</house><id>103</id><age>17</age><email>hannah@mail.com</email></details></student></data>
我试过的:
from lxml import etree as ET
import pandas as pd
df = pd.read_excel(open('Student_data.xlsx','rb'),sheet_name="Sheet2")
df['House_Id']=df['House'].map(str)+'-'+df['Id'].map(str)
required_ids = df['House_Id'].tolist()
required_ids = [str(i) for i in required_ids]
for event, element in ET.iterparse('new_student.xml'):
if element.tag == 'xml' and not(element.xpath('.//id/text()')[0] in required_ids):
element.clear()
element.getparent().remove(element)
if element.tag == 'data':
tree = ET.ElementTree(element)
tree.write('student_output.xml')
我可以使用 xlsx 文件中的 2 个变量(即 ['Blue-100', 'Blue-103'])创建所需的 id,但不知道如何:
- 使用 XML 创建一个类似的“pair-id”
- 导航以查找“pair-id”并创建一个仅包含所需行的新文件
请让我知道一种方法来做到这一点。提前致谢。
解决方案
我认为,如果您知道每行的各种 XML 声明中给出的编码始终是 UTF-8,那么您可以用几行处理文件,其中每行代表一个具有基于文件的 IO 和 lxml etree 的 XML 文档,如下所示:
from lxml import etree as ET
required_ids = ['100','103']
required_houses = ['Blue', 'Blue']
with open('input.txt', 'r') as f, open('output.txt', 'w') as w:
for line in f.readlines():
root = ET.fromstring(bytes(line, encoding = 'UTF-8'))
if root.xpath('.//id/text()')[0] in required_ids and root.xpath('.//house/text()')[0] in required_houses:
#ET.dump(root)
print(ET.tostring(root, encoding = 'unicode'), file = w, end = '\n')
推荐阅读
- twilio - 如何将 CNAM 添加到 Twillio
- c - 如何从函数中获取字符串并分配给它?
- stored-procedures - 在 Oracle 中分配数组或表变量
- php - ini_set('session.use_only_cookies', 1) 设置为 1,但条件说不
- node.js - 使用 Azure AD 与第三方进行 SSO
- java - 如果访问文件时发生错误或数据无效,如何让程序终止?
- angular - Angular:使用RouterLinkActive的子路由不起作用
- reactjs - 值属性未在函数中显示字符串
- php - 动态访问php列表
- java - 使用匹配正则表达式调用子类的方法