使用python替换XML文件中包含转义符的元素

时间:2018-12-13 13:39:48

标签: python xml python-3.x python-2.7

问题

我有一个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])

1 个答案:

答案 0 :(得分:0)

做到了。最后,这是一个简单的字符串替换。不过现在需要掉毛了。

    col1 col2 col3 count
2   A    B    C    3
3   A    B    B    2
5   A    B    C    3