从Python DataFrame生成动态XML:移除空值Address1/2标签保留空DateofBirth标签
问题描述
需要将表格数据转换为XML格式,需求如下:
- 当
Address1和Address2的值为null时,移除对应的XML标签(如用户Mark的情况) - 即使
DateofBirth的值为null,仍需保留该空标签
输入数据
name phone email address address1 address2 dateofbirth John 111111111 john@email.com Chicago Illinois Phoenix Mark 222222222 mark@email.com London
现有代码
def convert_row(row): return """<Document> <Name>%s</Name> <Phone>%s</Phone> <Email>%s</Email> <Address>%s</Address> <Address1>%s</Address1> <Address2>%s</Address2> <DateofBirth>%s</DateofBirth> </Document>""" % (row.name, row.phone, row.email, row.address, row.address1, row.address2,row.dob) with open('out.xml', 'w') as f: f.write('\n'.join(df.apply(convert_row, axis=1)))
当前输出
<Customer> <Name>John</Name> <Phone>111111111</Phone> <Email>john@email.com</Email> <Address>Chicago</Address> <Address1>Illinois</Address1> <Address2>Phoenix</Address2> <DateofBirth></DateofBirth> </Customer> <Customer> <Name>Mark</Name> <Phone>222222222</Phone> <Email>mark@email.com</Email> <Address>London</Address> <Address1></Address1> <Address2></Address2> <DateofBirth></DateofBirth> </Customer>
解决方案
修改convert_row函数,动态判断是否生成Address1和Address2标签,仅当字段非空时添加,DateofBirth标签则始终保留:
def convert_row(row): # 初始化XML基础内容,包含必选标签 xml_parts = [ "<Document>", f"<Name>{row.name}</Name>", f"<Phone>{row.phone}</Phone>", f"<Email>{row.email}</Email>", f"<Address>{row.address}</Address>" ] # 仅当Address1非空时添加对应标签 if row.address1 not in (None, '', ' '): xml_parts.append(f"<Address1>{row.address1}</Address1>") # 仅当Address2非空时添加对应标签 if row.address2 not in (None, '', ' '): xml_parts.append(f"<Address2>{row.address2}</Address2>") # 始终保留DateofBirth标签,空值时生成空标签 xml_parts.append(f"<DateofBirth>{row.dob if row.dob is not None else ''}</DateofBirth>") xml_parts.append("</Document>") return '\n'.join(xml_parts) with open('out.xml', 'w') as f: f.write('\n'.join(df.apply(convert_row, axis=1)))
关键说明
- 用列表逐步构建XML内容,避免复杂字符串拼接的冗余问题
- 对
Address1和Address2做多场景非空判断(覆盖None、空字符串、纯空格),满足条件才生成标签 DateofBirth标签不受空值影响,始终保留,空值时输出<DateofBirth></DateofBirth>- 用
'\n'.join()拼接内容,保证XML格式的可读性
修改后输出
<Document> <Name>John</Name> <Phone>111111111</Phone> <Email>john@email.com</Email> <Address>Chicago</Address> <Address1>Illinois</Address1> <Address2>Phoenix</Address2> <DateofBirth></DateofBirth> </Document> <Document> <Name>Mark</Name> <Phone>222222222</Phone> <Email>mark@email.com</Email> <Address>London</Address> <DateofBirth></DateofBirth> </Document>
内容的提问来源于stack exchange,提问作者Sri
相关产品推荐
相关产品推荐

