minidom不会在行尾读取\ n n换行符

时间:2014-03-14 18:01:01

标签: python xml newline minidom

我正在使用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'
    #}
  #}
#}

(请忽略/指出任何缩进错误)
现在即使setlocalC:\Tools\CMake2.8\bin\cmake.exe在xml文件中有一个换行符,我的代码也无法读取它,我不知道为什么。有人可以帮忙吗?

更新: 我试图将<Command>拆分为['setlocal','C:\ Tools \ CMake2.8 \ bin \ cmake.exe','C:/ tb / Source /../']

2 个答案:

答案 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}}