Pretty Print XML с SaxonPython

Программы на Python
Anonymous
Pretty Print XML с Saxon

Сообщение Anonymous »

Я пытаюсь красиво распечатать результат строки xquery. Чтобы сделать красивую печать, я последовал простому примеру здесь.
Мой код выглядит следующим образом:
docb= pyproc.new_document_builder()
xdoc = docb.parse_xml(xml_text=myxml)
#xdoc = docb.parse_xml(xml_file_name="c:/temp/myxml.xml")
xqp = pyproc.new_xquery_processor()
try:
result=xqp.run_query_to_string(input_xdm_item = xdoc,query_text=xquery,lang='3.1')
root = etree.fromstring(result)
print(etree.tostring(root, pretty_print=True).decode())
except Exception as e:
print(e)

При выполнении я получаю следующую ошибку:
Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.

Единственный способ работать, если я напишу этот запутанный код:
xml = bytes(bytearray(result, encoding='utf-8'))
root = etree.XML(xml)
print(etree.tostring(root, pretty_print=True).decode())

Когда я передаю обычную строку XML, все работает нормально и печатается красиво! Так что, похоже, проблема саксонская.
Отредактировано позже:
Я поправлен. Думаю, я должен извиниться перед Saxon за непонимание ограничений xquery и lmxl. См. комментарии Мартина Хоннена ниже. На самом деле я согласен, поскольку процессор xquery не знает, что такое тип вывода, эти вещи лучше оставить в самом сценарии xquery, используя объявления (о которых я не знал). На самом деле это сделает код даже намного чище, чем если бы мне пришлось использовать другую библиотеку в качестве lxml:
myxml = "123"

xquery = '''
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare option output:indent "yes";
declare option output:omit-xml-declaration "yes";
{
for $b in books/book

return $b
}


'''

with PySaxonProcessor(license=False) as pyproc:

docb= pyproc.new_document_builder()
xdoc = docb.parse_xml(xml_text=myxml)

xqp = pyproc.new_xquery_processor()

try:
result=xqp.run_query_to_string(input_xdm_item = xdoc,query_text=xquery,lang='3.1')
print(result)

except Exception as e:
print(e)

Результат будет:

1
2
3



Подробнее здесь: https://stackoverflow.com/questions/787 ... with-saxon

Вернуться в «Python»