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

如何通过AWS Glue实现S3内XML文件转JSON并存入指定目录

S3 XML批量转JSON实现方案

需求背景

  • 源存储位置:S3存储桶Fin-app-ops下路径data-ops/raw-d/中存储的所有XML文件
  • 转换规则:将XML文件转换为标准JSON格式
  • 目标存储位置:同存储桶下data-ops/con-d/路径,对应文件替换为.json后缀存储

原有代码问题

  • S3资源方法调用错误:boto3 S3资源获取桶实例的方法为Bucket(),原代码用了小写开头的bucket(),会直接抛出属性错误
  • 变量引用混乱:循环遍历返回的是S3对象key字符串存入datafile变量,后续判断、读取时却使用了未定义的obj变量
  • 未定义变量:代码中使用的bucket_name未赋值,目标文件名拼接处残留无效占位符enter code here,逻辑不完整
  • 逻辑缺陷:没有跳过S3前缀过滤返回的空目录对象,没有处理文件名后缀替换,会生成路径错误、后缀异常的目标文件;重复执行JSON序列化操作,浪费资源
  • 编码问题:没有指定UTF-8编码,遇到中文、特殊字符时容易出现乱码

可落地实现方案

方案1:修复后可直接运行的Python脚本(适配AWS Glue Python Shell任务)

该方案依赖极少,适合新手快速部署,Glue Python Shell环境自带boto3依赖,仅需补充安装xmltodict即可运行。

import json
import boto3
import xmltodict
from urllib.parse import unquote_plus

# 基础配置
s3 = boto3.client('s3')
BUCKET_NAME = 'Fin-app-ops'
SOURCE_PREFIX = 'data-ops/raw-d/'
TARGET_PREFIX = 'data-ops/con-d/'

# 分页拉取源路径下所有文件,避免文件量过大时返回结果被截断
paginator = s3.get_paginator('list_objects_v2')
page_iterator = paginator.paginate(Bucket=BUCKET_NAME, Prefix=SOURCE_PREFIX)

for page in page_iterator:
    if 'Contents' not in page:
        continue
    for obj in page['Contents']:
        file_key = unquote_plus(obj['Key'])
        # 跳过空目录、非XML后缀文件
        if file_key.endswith('/') or not file_key.lower().endswith('.xml'):
            continue
        
        # 读取源XML文件内容
        s3_resp = s3.get_object(Bucket=BUCKET_NAME, Key=file_key)
        xml_content = s3_resp['Body'].read()
        
        # XML转JSON
        xml_parsed_dict = xmltodict.parse(xml_content)
        json_content = json.dumps(xml_parsed_dict, ensure_ascii=False, indent=2)
        
        # 拼接目标文件路径
        relative_file_name = file_key.replace(SOURCE_PREFIX, '').rsplit('.xml', 1)[0] + '.json'
        target_key = f"{TARGET_PREFIX}{relative_file_name}"
        
        # 上传JSON到目标路径
        s3.put_object(
            Bucket=BUCKET_NAME,
            Key=target_key,
            Body=json_content.encode('utf-8'),
            ContentType='application/json'
        )
        print(f"转换完成: {file_key} -> {target_key}")

运行注意事项:

  • 新建Glue任务时选择Python Shell类型,Python版本选择3.9及以上即可,任务绑定的IAM角色需要提前授予Fin-app-ops桶的读写权限
  • 若运行提示缺少xmltodict依赖,直接在Glue任务配置的「高级属性-库」面板中,将xmltodict添加到pip安装包列表即可,无需手动打包依赖
  • 增量运行场景可增加S3对象最后修改时间判断,仅处理上次任务执行后新上传的文件,减少重复计算

方案2:Glue Studio零代码可视化方案(适合无Python基础场景)

如果不想维护代码,可以直接用Glue托管的可视化能力实现:

  • 打开Glue Studio新建可视化ETL任务
  • 数据源节点选择S3,配置源路径为data-ops/raw-d/,数据格式选择XML,按照界面提示配置XML解析规则(指定根节点、数据行标签即可)
  • 无需添加额外转换节点,Glue会自动将XML解析为结构化数据
  • 数据目标节点选择S3,配置目标路径为data-ops/con-d/,数据格式选择JSON,按需配置写入模式(新增/覆盖)
  • 保存任务后直接运行即可,文件遍历、格式转换、写入逻辑全由Glue托管,适合XML结构统一、文件量级较大的场景

内容的提问来源于stack exchange,提问作者Sarath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 08:57:21