You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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)))

关键说明

  1. 用列表逐步构建XML内容,避免复杂字符串拼接的冗余问题
  2. 对Address1和Address2做多场景非空判断(覆盖None、空字符串、纯空格),满足条件才生成标签
  3. DateofBirth标签不受空值影响,始终保留,空值时输出<DateofBirth></DateofBirth>
  4. 用'\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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 19:40:37