如何通过Saxonche获取XPath匹配的XML元素行号?
解决PySaxonche获取XML元素行号的问题
要获取匹配XPath的元素行号,你已正确启用行号功能,但核心问题是没有调用XdmNode对象的行号获取方法。以下是修正后的方案:
关键要点
- 启用行号仅需调用
doc_builder.set_line_numbering(True)即可,无需额外设置配置属性'l'(该参数属于Saxon命令行工具的用法,不适用于API调用)。 xpath_processor.evaluate()返回的是XdmValue集合,其中每个元素是XdmNode对象,行号需要通过调用该对象的get_line_number()方法主动获取,不会直接在调试器的属性列表中显示。
修正后的代码
from saxonche import XdmNode input_file_path = 'test.xml' input_xpath = './/foo' with PySaxonProcessor(license=False) as saxon_proc: doc_builder = saxon_proc.new_document_builder() # 启用行号 doc_builder.set_line_numbering(True) xml_tree = doc_builder.parse_xml(xml_file_name=input_file_path) xpath_processor = saxon_proc.new_xpath_processor() xpath_processor.set_context(xdm_item=xml_tree) foo_elements = xpath_processor.evaluate(input_xpath) # 遍历匹配结果,提取每个元素的行号 for elem in foo_elements: if isinstance(elem, XdmNode): print(f"匹配元素行号: {elem.get_line_number()}")
补充说明
- 针对你提供的
test.xml,运行代码后会输出匹配元素行号: 2,与XML中<foo>标签所在的行完全对应。 - 若代码未导入
XdmNode,需添加开头的导入语句以完成类型判断(也可省略类型判断直接调用方法,但添加判断能提升代码稳定性)。
内容的提问来源于stack exchange,提问作者Rainbolt
相关产品推荐
相关产品推荐

