<p>这是一个老问题,但我认为有一个比给出的答案更好的答案,所以我还是要再加一个答案。在</p>
<p>虽然在ContentHandler超类中可能确实存在一个名为_locator的未记录的私有数据成员,正如Martijn在上面的回答中所描述的,但是在我看来,使用这个数据成员访问位置信息并不是定位工具的预期用途。在</p>
<p>在我看来,史蒂夫·怀特提出了一些很好的问题,为什么这个成员没有被记录在案。我认为这些问题的答案是,它可能不是为了供公众使用。它似乎是ContentHandler超类的私有实现细节。由于它是一个没有文档记录的私有实现细节,它可能会随着SAX库的任何未来版本而消失,因此依赖它可能是危险的。在</p>
<p>从阅读ContentHandler类的文档,特别是ContentHandler.setDocumentLocator,设计人员希望用户改为重写ContentHandler.setDocumentLocator函数,以便当解析器调用它时,用户的contenthandler子类可以保存对传入的locator对象(由SAX解析器创建)的引用,并且可以在以后使用保存的对象来获取位置信息。例如:</p>
<pre><code>class MyContentHandler(ContentHandler):
def __init__(self):
super().__init__()
self._mylocator = None
# initialize your handler
def setDocumentLocator(self, locator):
self._mylocator = locator
def startElement(self, name, attrs):
loc = self._mylocator
if loc is not None:
line, col = loc.getLineNumber(), loc.getColumnNumber()
else:
line, col = 'unknown', 'unknown'
print 'start of {} element at line {}, column {}'.format(name, line, col)
</code></pre>
<p>有了这种方法,就没有必要依赖于未记录的字段。在</p>