python

超轻量级php框架startmvc

python处理xml文件的方法小结

更新时间:2020-04-29 21:54:01 作者:startmvc
本文实例讲述了python处理xml文件的方法。分享给大家供大家参考,具体如下:前一段时间因

本文实例讲述了python处理xml文件的方法。分享给大家供大家参考,具体如下:

前一段时间因为工作的需要,学习了一点用Python处理xml文件的方法,现在贴出来,供大家参考。

xml文件是按节点一层一层来叠加的,最顶层的是根节点。比如说:


<sys:String x:Key="STR_License_WithoutLicense">Sorry, you are not authorized.</sys:String>

其中sys:String为节点名字,x:Key的内容为Attribute,xml节点值为sys:String的子节点,它是文本节点类型。<节点名称   x:Key="Attribute">子节点。。。

RPD的xml格式:


<ResourceDictionary>
<sys:String x:Key="STR_Startup_LaunchRPD">Launching Polycom RealPresence Desktop</sys:String>
<sys:String x:Key="STR_Startup_CheckFolder">Checking folder</sys:String>

CMAD的xml格式:


<language-strings>
 <ABK_CALL comment="verb (command, button on screen to press to place a call);" controls="Button" products="HDX,VSX,CMAD,Venus Main">
 <ARABIC notes="" last-change-date="" status="">打电话</ARABIC>
 <CHINESE_S notes="" last-change-date="" status="">呼叫</CHINESE_S>

该代码的功能是:

从RPD的String中取出节点值,在CMAD的String中查找是否已经存在,如果存在,则返回CMAD中对应String的NodeName(节点名),并把两个节点名一个做节点名,一个做节点值写到xml文件中;如果不存在,则把RPD中的该节点写到另外一个xml文件中。代码如下:


import xml.dom.minidom
from xml.dom.minidom import Document
RPD_Str_path = "E:/PythonCode/StringResource.en-US.xaml"
RPD_dom = xml.dom.minidom.parse(RPD_Str_path)
CMAD_Str_path = "E:/PythonCode/M500_RPM13_0522.xml"
CMAD_dom = xml.dom.minidom.parse(CMAD_Str_path)
#得到根节点
RPD_root = RPD_dom.documentElement
CMAD_root = CMAD_dom.documentElement
def IsStr_already_Translated(RPD_Str):
 for firstLevel in CMAD_root.childNodes:
 for SecondLevel in firstLevel.childNodes:
 if SecondLevel.nodeType == SecondLevel.ELEMENT_NODE:
 if SecondLevel.nodeName == "ENGLISH_US":
 if RPD_Str == SecondLevel.childNodes[0].data.strip():
 return firstLevel.nodeName
 else:
 continue
 else:
 continue
 else:
 continue
 else:
 continue
 else:
 return "Null"
#用Document来写xml文件
Mapping_doc = Document()
Mapping_root = Mapping_doc.createElement("Common_String")
Mapping_doc.appendChild(Mapping_root)
Translation_doc = Document()
Translation_root = Translation_doc.createElement("Need_Translation_String")
Translation_doc.appendChild(Translation_root)
for node in RPD_root.childNodes:
 if node.nodeType == node.ELEMENT_NODE:
# print node.getAttribute("x:Key") +" + "+ node.childNodes[0].data
 CMAD_Key = IsStr_already_Translated(node.childNodes[0].data.strip())
 if(CMAD_Key != "Null"):
 mKey = Mapping_doc.createElement(node.getAttribute("x:Key"))
 Mapping_root.appendChild(mKey)
 mValue = Mapping_doc.createTextNode(CMAD_Key)
 mKey.appendChild(mValue)
 elif(CMAD_Key == "Null"):
 Key = Translation_doc.createElement('sys:String')
 Translation_root.appendChild(Key)
 Key.setAttribute('x:Key', node.getAttribute("x:Key"))
 Value = Translation_doc.createTextNode(node.childNodes[0].nodeValue)
 Key.appendChild(Value)
 continue
else:
 path1 = "E:/PythonCode/ID_Mapping.xml"
 try:
 import codecs
 f1 = codecs.open(path1, "wb", "utf-8")
 f1.write(Mapping_doc.toprettyxml(indent=" "))
 except:
 print('Write xml file failed.... file:{0}'.format(path1))
 path2 = "E:/PythonCode/Need_Translate_String.xml"
 try:
 f2 = codecs.open(path2, "wb", "utf-8")
 f2.write(Translation_doc.toprettyxml(indent=" "))
 except:
 print('Write xml file failed.... file:{0}'.format(path2))

PS:这里再为大家提供几款关于xml操作的在线工具供大家参考使用:

在线XML/JSON互相转换工具: http://tools.jb51.net/code/xmljson

在线格式化XML/在线压缩XMLhttp://tools.jb51.net/code/xmlformat

XML在线压缩/格式化工具: http://tools.jb51.net/code/xml_format_compress

XML代码在线格式化美化工具: http://tools.jb51.net/code/xmlcodeformat

python xml文件