簡體   English   中英

minidom 不會在行尾讀取 \\n 換行符

[英]minidom doesn't read \\n newline character at the end of line

我正在使用 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/../']

您不想在空格 ( ' ' ) 上拆分文本值,而是希望在所有空白上拆分它,因為這些看起來像命令行,所以應該使用適當的解析器來拆分它們。 你想改變:

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

另一種可能性,考慮獨立於特定操作系統的行分隔符,可能如下,使用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']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM