我使用minidom解析器读取xml。我面临的问题是,当它完成阅读行时,它不读取行结束字符。例如我的xml文件是这样的:
<?xml version="1.0" ?><ItemGroup>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">setlocal
C:ToolsCMake2.8bincmake.exe C:/tb/Source/../</Command>
</ItemGroup>
,我的python代码看起来像这样:
dom = xml.dom.minidom.parse(fileFullPath)
nodes = dom.getElementsByTagName('Command')
for j in range(len(nodes)):#{
path = nodes[j].childNodes[0].nodeValue
if nodeName == 'Command':#{
pathList = path.split(' ')
for i in range(len(pathList)):#{
sPath = pathList[i]
if sPath.find('\n')!=-1:
print 'sPath has \n'
#}
#}
#}
(请忽略/指出任何缩进错误)
现在即使setlocal
和C:ToolsCMake2.8bincmake.exe
在xml文件中有一个换行符,我的代码也无法读取它,我不知道为什么。有人能帮帮忙吗?
更新:我试图将<Command>
拆分为['setlocal', 'C:ToolsCMake2.8bincmake.exe', 'C:/tb/Source/../']
另一种可能性,独立考虑行分隔符对于特定的操作系统,使用in
操作符可能如下所示和os.linesep
。我还使用'n'
(没有转义)尝试了这个代码(反斜杠)而不是os.linesep
。两个版本都有效。(因此,我的shell不能运行xml.dom.minidom.parse(...)
您可以忽略导入中的一些更改
from xml.dom.minidom import parse
import os
dom = parse(fileFullPath)
nodes = dom.getElementsByTagName('Command')
for node in nodes:
path = node.childNodes[0].nodeValue
if node.nodeName == 'Command':
for path in path.split(' '):
if os.linesep in path:
print r'Path contains n or whatever your OS uses.'
我也离开了' '
在分裂,因为它似乎有setlocal
在你的路径列表这不是你的目标。
编辑:在我注意到你的评论说你实际上希望有setlocal
在你的列表,我还会说检查n
是多余的,因为分裂By all whitespaces当然也将行分隔符视为空白符。
'anb'.split()
为
['a', 'b']
不是在空格上分割文本值(' '
),而是在所有空白上分割文本值,由于这些看起来像命令行,因此应该使用适当的解析器对它们进行分割。您要更改:
pathList = path.split(' ')
for i in range(len(pathList)):#{
sPath = pathList[i]
if sPath.find('\n')!=-1:
print 'sPath has \n'
:
import shlex
pathList = shlex.split(path, posix=False)
这将给你:
['setlocal', 'C:\Tools\CMake2.8\bin\cmake.exe', 'C:/tb/Source/../']
- 注意:如果你的任何路径包含空格并且没有被正确地引用,它们将被错误地分割。例如,
'C:\Program Files'
将被分割为['C:\Program', 'Files']
,但'"C:\Program Files"'
将被分割为['C:\Program Files']
。
同样,你的代码可以稍微清理一下,因为Python不是C语言,Javascript等。
import xml.dom.minidom
import shlex
dom = xml.dom.minidom.parse(fileFullPath)
nodes = dom.getElementsByTagName('Command')
for node in nodes:
path = node.childNodes[0].nodeValue
pathList = shlex.split(path, posix=False)
print pathList