问题
我有一个XML文件。我希望将小写的XML属性替换为Windows系统上存在的大小写混合形式。
在源XML上进行替换的最佳方法是什么?
我最初的冲动是使用Regex。但是,由于路径需要转义,因此Regex看起来很乱。然后,我考虑使用sed,但必须有更好的方法。
是否建议为此类操作使用python模块?
背景
这是因为我有2个程序(A,B)在Windows系统上创建XML。程序A输出带有混合大小写文件路径的XML。程序B输出小写的文件路径。这些文件路径在Linux系统上由程序C进行比较,因此匹配失败。我无权访问程序A的输出或程序C的配置。
XML源
<?xml version="1.0" encoding="utf-8"?>
<disk>
<files>
<file name="C:\mydisk\dir1\myfile\myfile.cpp" >
</files>
</disk>
Python脚本
from __future__ import print_function
import sys
from lxml import etree as ET
from win32file import GetLongPathName,GetFullPathName
from win32api import FindFiles
# I can use the win32 module to extract the correct path.
def GetFilePathAndNameinTrueCase(filename) :
if sys.platform == 'win32':
try:
fullname = GetLongPathName(filename)
firstmatchingfileobject = FindFiles(filename)
filenamewithcase = firstmatchingfileobject[0][8]
pathwithcase = GetFullPathName(filename)
patharray = pathwithcase.split( '\\' )
pathonlylist = patharray[:-1]
pathonly = '\\'.join(pathonlylist)
nameandfilepathwithcase = pathonly + '\\' + filenamewithcase
return nameandfilepathwithcase
except Exception as e:
print(e)
return False
# I can use the lxml module to extract the filenames and paths from the xml.
def ExtractFilenameFromXML(myxmlfile):
fileslist = []
root = ET.parse(myxmlfile)
# use xpath to find the filenames in the XML
for filepath in root.findall("disk/files/file"):
filestr = filepath.attrib['name']
fileslist.append( filestr)
#remove duplicates in the list
fileslist = list(set(fileslist))
return fileslist
def ReplaceLowercaseFilepathwithCorrectCase(filename):
# Is there a pythonic way to replace XML elements containing \ escape characters?
if __name__=='__main__':
import sys
if len(sys.argv)<2:
print( "Please specify a file name")
else:
ReplaceLowercaseFilepathwithCorrectCase(sys.argv[1])
答案 0 :(得分:0)
做到了。最后,这是一个简单的字符串替换。不过现在需要掉毛了。
col1 col2 col3 count
2 A B C 3
3 A B B 2
5 A B C 3