Python解析Android項目中的strings.xml
python 解析 Android 項目里的 strings.xml
針對大家在 Android 項目中可能用到的多國語言翻譯,需要把 value 里的內(nèi)容解析出來,方便做編輯,可以使用以下 python 腳本輕松實現(xiàn)
import xml.etree.ElementTree as ET # 解析 strings.xml 文件 xml_file = 'strings.xml' tree = ET.parse(xml_file) root = tree.getroot() # 提取所有 <string> 標簽的 name 和內(nèi)容 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開發(fā)的時候要做國際化,需要將Android工程中的字符串資源導出到excel,讓專業(yè)團隊翻譯。由于項目比較多,手動復制不現(xiàn)實,故使用python 將xml文件中對應的字符串解析到excel中。
用法
復制以下代碼到python文件中,如string2excel.py, 添加可執(zhí)行權限(mac 電腦 chmod +x string2excel.py),將所有要導出的strings.xml復制到string2excel.py同一目錄下,執(zhí)行./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]獲取的是除了文件名以外的內(nèi)容 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 #記錄表名和行數(shù),用于統(tǒng)計 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實現(xiàn)Android國際化多語言strings.xml文件與excel互轉
下面將通過Python腳本實現(xiàn)strings.xml文件中的多語言文本轉換到Excel表格,同時提供了兩種轉換功能:strings.xml轉Excel和Excel轉strings.xml
完整代碼
#可實現(xiàn)string.xml中資源匯總到excel文件,需自行創(chuàng)建in文件夾,并把string.xml文件全部放入,生成excel在out文件夾 #也可通過excel統(tǒng)計的資源生成對應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): # 如果文件夾不存在,則創(chuàng)建文件夾 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 # 檢查/創(chuàng)建輸出路徑 check_out_put() # 遍歷列數(shù)據(jù),不包含最大數(shù) 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) # 創(chuàng)建根元素 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 # 創(chuàng)建子元素 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(): # 檢查/創(chuàng)建輸出路徑 check_out_put() # 刪除上次生成的excel文件 if os.path.isfile(outExcelName): os.remove(outExcelName) # 創(chuàng)建一個新的工作簿對象 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 # 判斷元素是否已經(jīng)添加到excel文件,將xml的name添加到第一列 if key in stringNames: # 找出當前元素所在行 # 數(shù)組下標從零開始,excel文件下標從1開始,得加1,第一行是文件名,再加1 row = stringNames.index(key)+2 else: # 元素名添加到數(shù)組 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 # 將翻譯的文本內(nèi)容寫入對應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): #因為列名是字母需要將數(shù)字轉換成字母 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內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
利用Matplotlib繪制折線圖、散點圖、柱狀圖、直方圖、餅圖的實例
這篇文章主要介紹了利用Matplotlib繪制折線圖、散點圖、柱狀圖、直方圖、餅圖的實例代碼,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09