我正在使用minidom解析器来读取xml。我面临的问题是,当读完行时,它不会读取行尾字符。例如,我的xml文件类似于:
<?xml version="1.0" ?><ItemGroup>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">setlocal
C:\Tools\CMake2.8\bin\cmake.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:\Tools\CMake2.8\bin\cmake.exe
在xml文件中有一个换行符,我的代码也无法读取它,我不知道为什么。有人可以帮忙吗?
更新:
我试图将<Command>
拆分为['setlocal','C:\ Tools \ CMake2.8 \ bin \ cmake.exe','C:/ tb / Source /../']
答案 0 :(得分:0)
您希望将文本值分散到空格(' '
)上,而不是将文本值分散到所有空格上,因为它们看起来像命令行,所以应使用适当的解析器对它们进行拆分。你想改变:
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
答案 1 :(得分:0)
另一种可能性,独立考虑线分离器
特定的操作系统,可能是以下,使用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
之后
列表,我还要说检查'a\nb'.split()
是多余的,因为拆分
所有空格当然也将行分隔符视为空格。
['a', 'b']
给出
{{1}}