Анализаторът на Expat има тази функционалност. Ето един бърз и мръсен пример:
from xml.parsers.expat import ParserCreate, ExpatError, errors
p = ParserCreate()
def start_element(name, attrs):
print(f"Start element at line {p.CurrentLineNumber}, col. {p.CurrentColumnNumber}, byte {p.CurrentByteIndex}: {name}")
def end_element(name):
print(f"End element at line {p.CurrentLineNumber}, col. {p.CurrentColumnNumber}, byte {p.CurrentByteIndex}:", name)
def char_data(data):
print(f"Character data at line {p.CurrentLineNumber}, col. {p.CurrentColumnNumber}, byte {p.CurrentByteIndex}:", repr(data))
def parse_xml(xml: str):
try:
p.StartElementHandler = start_element
p.EndElementHandler = end_element
p.CharacterDataHandler = char_data
p.Parse(xml)
except ExpatError as err:
print("Error:", errors.messages[err.code])
parse_xml("<root>abc <tag>ghi</tag>\n def</root>")
и ето изхода от този код:
Start element at line 1, col. 0, byte 0: root
Character data at line 1, col. 6, byte 6: 'abc '
Start element at line 1, col. 10, byte 10: tag
Character data at line 1, col. 15, byte 15: 'ghi'
End element at line 1, col. 18, byte 18: tag
Character data at line 1, col. 24, byte 24: '\n'
Character data at line 2, col. 0, byte 25: ' def'
End element at line 2, col. 4, byte 29: root
Както можете да видите, той може да отпечата номера на реда, номера на колоната и позицията на байта на всеки XML елемент.
person
JustAC0der
schedule
09.01.2021
sourceline
, но това ви дава само номер на ред - person gsnedders   schedule 03.08.2016