我最近试图在Tkinter中实现一个额外的功能。我的问题很容易理解。下面我提到了我的代码和XML文件。
data.xml中:
<?xml version="1.0" ?>
<p1:FILE xmlns:p1="http://www.example.org/eHorizon">
<Time nTimestamp="12">
<Test>
<Car/>
</Test>
</Time>
</p1:FILE>
代码:
from Tkinter import *
from tkFileDialog import askopenfilename
from distutils.filelist import findall
from lxml import etree
fileOpen = open("C:/Users/your-location/data.xml")
root = Tk()
text = Text(root, height=30, width = 40)
text.pack()
text.insert(END,fileOpen.read())
recovering_parser = etree.XMLParser(recover=True)
xmlLog = etree.parse("C:/Users/your-location/data.xml",parser=recovering_parser).getroot()
ElementsList = xmlLog.findall("Time")
print "The line number of Time element is = ", ElementsList[0].sourceline #prints 5,
#but I want to ignore blank lines and print #answer as 3 (please look in notepad++ format below)
root.mainloop()
notepad ++中的data.xml:
我想要的是什么:
我只想在有空行的地方省略行号。因此,每当我使用sourceline
时,它应该返回不包括所有空格的行号
在上面的代码print "The line number of Time element is = ", ElementsList[0].sourceline
中应该打印答案3(不包括空行)而不是5(包括空白行)。
我尝试了什么:
我尝试到处寻找,但没有得到我想要的东西。坦率地说,到目前为止,我甚至无法思考如何启动。我已经在使用sourceline
,只是考虑所有空格返回给定的行号。
编辑:我正在使用sourceline
因为我正在处理xml元素并使用lxml库来提取xml数据。
答案 0 :(得分:2)
如果你真的想这样做,我会看到两个选项:
重新创建没有空行的文件。
跟踪每个实际源行号之前存在多少空行。从实际的源行号中减去它。
# track blanks
blanks_before_line = [0]
with open('data.xml') as f:
for line in f:
new_blanks = blanks_before_line[-1]
if not line.strip():
new_blanks += 1
blanks_before_line.append(new_blanks)
# now in your code subtract it
# .....
real_sourceline = ElementsList[0].sourceline
adjusted_sourceline = real_sourceline - blanks_before_line[real_sourceline - 1]
print "The line number of Time element is = ", adjusted_sourceline