Код: Выделить всё
Код: Выделить всё
import xml.etree.ElementTree as ET
import chess
import chess.pgn
xml_data = """
"""
def collect_main_line(xml_elem):
"""Собирает ходы только из высшего уровня — без вложенных ."""
moves = []
for child in xml_elem:
if child.tag.lower() == "move":
m = child.get("m")
if m:
moves.append(m)
return moves
def xml_to_mainline_pgn(root_line):
# Создаём игру
game = chess.pgn.Game()
# Устанавливаем начальную позицию, если указан FEN
fen = root_line.get("fen")
if fen:
board = chess.Board(fen)
game.setup(board)
else:
board = chess.Board()
game.setup(board)
moves_san = collect_main_line(root_line)
node = game
for san in moves_san:
move = board.parse_san(san)
board.push(move)
node = node.add_main_variation(move)
return game
def main():
root = ET.fromstring(xml_data.strip())
game = xml_to_mainline_pgn(root)
exporter = chess.pgn.StringExporter(headers=True, variations=False, comments=False)
pgn_text = game.accept(exporter)
print(pgn_text)
with open("main_line_only.pgn", "w", encoding="utf-8") as f:
f.write(pgn_text)
print("PGN сохранён в main_line_only.pgn")
if __name__ == "__main__":
main()
Я пытаюсь преобразовать эту структуру в файл PGN с помощью библиотеки python-chess.
Я уже знаю, как добавить ходы по основной линии в Chess.pgn.Game(), но не могу понять, как правильно добавить варианты и вложенные подварианты в дерево PGN.
Как рекурсивно добавлять ходы и варианты в python-chess, чтобы каждый вложенный стал правильным вариантом PGN (т. е. (...))?
Должен ли я вручную пройти по дереву и использовать node.add_variation(move) для каждой ветки? Или есть более идиоматический способ создания PGN с подвариантами, используя python-chess?
Подробнее здесь: https://stackoverflow.com/questions/798 ... ing-python
Мобильная версия