Issue 13784: Documentation of xml.sax.xmlreader: Locator.getLineNumber() and Locator.getColumnNumber() (original) (raw)

Problem: Locator methods return the location where the event starts, not where it ends. Locator line numbers start at 1, Locator column numbers can be 0.

Proposal: Adapt documentation.

From the docs: Instances of Locator provide these methods:

Locator.getColumnNumber() Return the column number where the current event ends.

Locator.getLineNumber() Return the line number where the current event ends

My Test:

import xml.sax

data = b"""

"""

class MyHandler(xml.sax.handler.ContentHandler):

def startElement(self, name, attrs):
    if name == "sub":
        print("open", name, self._locator.getLineNumber(), self._locator.getColumnNumber())
        
def endElement(self, name):
    if name == "sub":
        print("close", name, self._locator.getLineNumber(), self._locator.getColumnNumber())

xml.sax.parseString(data, MyHandler())

Output:

open sub 2 4 close sub 7 4

The reported behavior has been verified -- the documented behavior is indeed incorrect for both Locator.getColumnNumber() and Locator.getLineNumber(). The beginning line and column numbers are returned, not the end.

This has been tested and verified for Python 2.7, Python 3.5.1 and a local build of the current default branch.