Python解析Android项目中的strings.xml

 更新时间:2025年07月25日 08:49:30   作者:IT乐手  
这篇文章主要为大家详细介绍了如何使用Python解析Android项目中的strings.xml,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

python 解析 Android 项目里的 strings.xml

针对大家在 Android 项目中可能用到的多国语言翻译,需要把 value 里的内容解析出来,方便做编辑,可以使用以下 python 脚本轻松实现

import xml.etree.ElementTree as ET

# 解析 strings.xml 文件
xml_file = 'strings.xml'
tree = ET.parse(xml_file)
root = tree.getroot()

# 提取所有 <string> 标签的 name 和内容
strings_dict = {}
for string_elem in root.findall('string'):
    name = string_elem.get('name')
    value = string_elem.text
    strings_dict[name] = value

# 输出结果
for k, v in strings_dict.items():
    print(f'{k}: {v}')
    # print(f'{v}')

Python将android strings.xml导出到excel

做Android开发的时候要做国际化,需要将Android工程中的字符串资源导出到excel,让专业团队翻译。由于项目比较多,手动复制不现实,故使用python 将xml文件中对应的字符串解析到excel中。

用法

复制以下代码到python文件中,如string2excel.py, 添加可执行权限(mac 电脑 chmod +x string2excel.py),将所有要导出的strings.xml复制到string2excel.py同一目录下,执行./string2excel.py 就会在同级目录下生成excel文件。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

#Android国际化: 将xml文件中对应的字符串解析到excel中

import xml.dom.minidom
from xlwt import Workbook
import os
def all_path(dirname,subfix):

    result = []#所有的文件
    filter=[subfix] #设置过滤后的文件类型 当然可以设置多个类型

    for maindir, subdir, file_name_list in os.walk(dirname):

        # print("1:",maindir) #当前主目录
        # print("2:",subdir) #当前主目录下的所有目录
        # print("3:",file_name_list)  #当前主目录下的所有文件

        for filename in file_name_list:
            apath = os.path.join(maindir, filename)#合并成一个完整路径
            ext = os.path.splitext(apath)[1]  # 获取文件后缀 [0]获取的是除了文件名以外的内容
            if ext in filter:
               result.append(apath)

    return result

#新建一个workbook
book = Workbook(encoding='utf-8')
#生成的excel表名称
excel_file_name = 'Android_strings.xls'
#要处理的文件所在路径及文件后缀
all_file=all_path("./",".xml")

#打印所有要输出的文件的路径及名称
print(all_file)

sheet_info = []

class SheetInfo:
    sheet_name=''
    elementCount = 0
    def __init__(self, name, count):
        self.sheet_name = name
        self.elementCount = count


for file in all_file:

    filename= os.path.splitext(os.path.basename(file))[0]

    sheet = book.add_sheet(filename)

    #打开xml
    xmldoc = xml.dom.minidom.parse(file)
    code = xmldoc.getElementsByTagName('string')

    #表头
    row = 0
    sheet.write(row, 0, 'Key')
    sheet.write(row, 1, 'EN')
    row = row+1

    #读取每一行写到excel中
    for node in code:
        for item in node.childNodes:
            sheet.write(row, 0, node.getAttribute('name'))
            sheet.write(row, 1, item.data)

        row = row+1

    #记录表名和行数,用于统计
    sheet_info.append(SheetInfo(filename,row-1))
#保存workbook
book.save(excel_file_name)

#增加汇总表
sheet = book.add_sheet('汇总')
row= 1
for element in sheet_info:
    sheet.write(row, 0, element.sheet_name)
    sheet.write(row, 1, element.elementCount)
    row = row+1
#保存workbook
book.save(excel_file_name)

python实现Android国际化多语言strings.xml文件与excel互转

下面将通过Python脚本实现strings.xml文件中的多语言文本转换到Excel表格,同时提供了两种转换功能:strings.xml转Excel和Excel转strings.xml

完整代码

#可实现string.xml中资源汇总到excel文件,需自行创建in文件夹,并把string.xml文件全部放入,生成excel在out文件夹
#也可通过excel统计的资源生成对应string.xml,放至out文件夹

import openpyxl  
import os  
import xml.etree.ElementTree as ET

outPath="out"
outExcelName=os.path.join(outPath, '翻译文本.xlsx')
inPath="in"

def check_suffix(filePath):
    return os.path.splitext(filePath)[1]=='.xml'
    
def check_out_put():
    # 检查文件夹是否存在  
    if not os.path.exists(outPath):  
        # 如果文件夹不存在,则创建文件夹  
        os.makedirs(outPath)

def excel_2_xml():  
    path = input("请输入Excel文件(.xlsx)路径: ")
    # path = "D:/code/py_stringxml/tets.xlsx"
    
    # 打开Excel文件  
    workbook = openpyxl.load_workbook(path)  
  
    # 获取工作表对象  
    worksheet = workbook.active  
    # 检查/创建输出路径  
    check_out_put()
    
    # 遍历列数据,不包含最大数  
    for col in range(2, worksheet.max_column+1):
        # 取excel当前列第一行作为strings.xml的文件名
        filename = os.path.join(outPath, worksheet.cell(row=1, column=col).value)
        print("file name:", filename) 
        
        # 创建根元素
        root = ET.Element("resources")  
        
        for rows in range(2, worksheet.max_row+1):
            #每一行第一列为name
            key = worksheet.cell(rows, 1).value
            value = worksheet.cell(rows, col).value
  
            # 创建子元素  
            if not value is None:
                item = ET.SubElement(root, "string", name=key)  
                item.text = value  
        
        # 将XML写入文件  
        tree = ET.ElementTree(root)  
        # 添加换行和缩进
        ET.indent(tree, space='\t', level=0)
        tree.write(filename, xml_declaration=True, encoding="utf-8")
        
    # 关闭Excel文件  
    workbook.close()
    
    print("处理完成")
  
def xml_2_excel():  
    # 检查/创建输出路径  
    check_out_put()
    # 删除上次生成的excel文件
    if os.path.isfile(outExcelName):
        os.remove(outExcelName)
    
    # 创建一个新的工作簿对象  
    workbook = openpyxl.Workbook()  
    # 选择活动工作表  
    worksheet = workbook.active 
    
    stringNames=[]
    # 第一列存放string.xml中的name,翻译文件从第二列开始
    col=2
    # 遍历输入路径夹中所有xml文件
    for file in os.listdir(inPath):
        # 非xml后缀名不做处理
        if check_suffix(file) is False:
            continue
        print("file", file)
        
        row=1
        # 解析 XML 文件  
        tree = ET.parse(os.path.join(inPath, file))  
        # 获取根元素  
        root = tree.getroot()
        
        #设置单元格属性(自动换行,顶端对齐)
        cell_style = openpyxl.styles.Alignment(vertical='top', wrap_text=True)   
        #excel文件名添加到第一行
        worksheet.cell(row=row, column=col, value=file)
        # 从第二行开始写入value值
        row=row+1
        # 遍历所有子元素  
        for child in root.iter():  
            key = child.get('name')
            if key is None:
                continue
            # 判断元素是否已经添加到excel文件,将xml的name添加到第一列
            if key in stringNames:
                # 找出当前元素所在行
                # 数组下标从零开始,excel文件下标从1开始,得加1,第一行是文件名,再加1
                row = stringNames.index(key)+2
                
            else:
                # 元素名添加到数组
                stringNames.append(key)
                # 添加到最后一行,第一行是文件名,得加1
                row = len(stringNames)+1
                m_cell = worksheet.cell(row=row, column=1) 
                m_cell.value = key  
                # 设置单元格属性
                m_cell.alignment = cell_style    
            
            value = child.text
            
            # 将翻译的文本内容写入对应excel单元格  
            if not key is None:
                # print("current", col, row)
                m_cell = worksheet.cell(row=row, column=col) 
                m_cell.value = value  
                # 设置单元格属性
                m_cell.alignment = cell_style
            else:
                print("key is None:", col, row)
            # 写入下一行
            row=row+1
        # 下一个文件从下一列开始
        col=col+1
    
    for i in range(1, col):  
        #因为列名是字母需要将数字转换成字母
        c = openpyxl.utils.get_column_letter(i) 
        #设置单元格宽度
        worksheet.column_dimensions[c].width = 40 
    
    # 保存Excel文件        
    workbook.save(outExcelName)
    
    print("处理完成")
        
if __name__ == "__main__":  
    select = input("请输入操作选项:\n1、excel文件转换成string.xml\n2、string.xml转换成excel文件\n")
    if select == "1":
        excel_2_xml()  
    else:
        xml_2_excel()
    input("按任意键退出...")

到此这篇关于Python解析Android项目中的strings.xml的文章就介绍到这了,更多相关Python解析Android中xml内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 用Python编写一个国际象棋AI程序

    用Python编写一个国际象棋AI程序

    在这篇文章中我会介绍这个AI如何工作,每一个部分做什么,它为什么能那样工作起来。你可以直接通读本文,或者去下载代码,边读边看代码。虽然去看看其他文件中有什么AI依赖的类也可能有帮助,但是AI部分全都在AI.py文件中
    2014-11-11
  • 利用Matplotlib绘制折线图、散点图、柱状图、直方图、饼图的实例

    利用Matplotlib绘制折线图、散点图、柱状图、直方图、饼图的实例

    这篇文章主要介绍了利用Matplotlib绘制折线图、散点图、柱状图、直方图、饼图的实例代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Python中单引号、双引号和三引号具体的用法及注意点

    Python中单引号、双引号和三引号具体的用法及注意点

    这篇文章主要给大家介绍了关于Python中单引号、双引号和三引号具体的用法及注意点的相关资料,Python中单引号、双引号、三引号中使用常常困惑,想弄明白这三者相同点和不同点,需要的朋友可以参考下
    2023-07-07
  • python数组转换为矩阵的方法实现

    python数组转换为矩阵的方法实现

    本文主要介绍了python数组转换为矩阵的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Python面向对象之类和对象

    Python面向对象之类和对象

    这篇文章主要为大家介绍了Python类和对象,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • python多线程扫描端口(线程池)

    python多线程扫描端口(线程池)

    这篇文章主要为大家详细介绍了python多线程扫描端口,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • 两个很实用的Python装饰器详解

    两个很实用的Python装饰器详解

    这篇文章主要为大家介绍了Python的装饰器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助,希望能够给你带来帮助
    2021-11-11
  • 聊聊.py和.ipynb的一些小知识

    聊聊.py和.ipynb的一些小知识

    这篇文章主要介绍了聊聊.py和.ipynb的一些小知识,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • 节日快乐! Python画一棵圣诞树送给你

    节日快乐! Python画一棵圣诞树送给你

    节日快乐!这篇文章主要介绍了如何使用Python画一棵圣诞树,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • python浅拷贝与深拷贝使用方法详解

    python浅拷贝与深拷贝使用方法详解

    浅拷贝,指的是重新分配一块内存,创建一个新的对象,但里面的元素是原对象中各个子对象的引用。深拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和原对象没有任何关联
    2022-11-11

最新评论