【问题标题】:minidom doesn't read \\n newline character at the end of lineminidom 不会在行尾读取 \\n 换行符
【发布时间】:2014-04-20 04:30:39
【问题描述】:

我正在使用 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 文件中它们之间有一个换行符,我的代码也无法读取它,我不知道为什么。有人可以帮忙吗?

更新: 我正在尝试将&lt;Command&gt; 拆分为 ['setlocal', 'C:\Tools\CMake2.8\bin\cmake.exe', 'C:/tb/Source/../']

【问题讨论】:

  • 您如何尝试处理&lt;Command&gt; 中的文本?其中第一行是setlocal,第二行是C:\Tools\CMake2.8\bin\cmake.exe C:/tb/Source/../。或者更好的说法是:在解析来自&lt;Command&gt; 的文本后,您希望结果是什么样的?
  • 你想把&lt;Command&gt;拆分成['setlocal', 'C:\\Tools\\CMake2.8\bin\\cmake.exe', 'C:/tb/Source/../']吗?
  • 是的。我正在尝试将 拆分为 ['setlocal', 'C:\\Tools\\CMake2.8\bin\\cmake.exe', 'C:/tb/Source/../']跨度>
  • 您的问题解决了吗?

标签: python xml newline minidom


【解决方案1】:

另一种可能性,独立考虑行分隔符 特定的操作系统,可能如下,使用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 不是你的目标。

编辑: 在我注意到您的评论表明您实际上想要在您的 列表,我还要说检查 \n 是多余的,因为拆分 by all whitespaces 当然也将行分隔符视为空格。

'a\nb'.split()

给予

['a', 'b']

【讨论】:

    【解决方案2】:

    您不想在空格 (' ') 上吐出文本值,而是希望将其拆分为所有空白,并且由于这些看起来像命令行,因此应使用适当的解析器对其进行拆分。你想改变:

    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
    

    【讨论】:

    • 我正在使用索引,因为我想按顺序遍历列表。在我的情况下,也检查 '\n' 也不起作用。我已经尝试过了。但是感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    相关资源
    最近更新 更多