построить структуру данных для софтины, ворочающей xml-файл, если мы знаем только о части хранящихся в нём данных?
строить структуру данных исходя из известных данных, рядом иметь процедуры по их вытягиванию из файла
Ну, данные, которые нам не интересны, в итоговом файле после обработки нами нужно сохранить. Причём иногда ещё сделать с ними что-то.
Знаем часть данных, и что? Это мешает как-то?
Я как-то писал потоковую читалко-писалку xml
Это не даёт построить адекватно модели. Мы не знаем до конца, какие там могут быть теги, атрибуты и прочее.
yml, который не ямл, а который яндексовый товарофид
Я не понял, вы знаете только часть схемы xml-файла или у вас нет конкретной схемы для файла?
А какие операции вообще будут с данными? Вот приходит хмл-ка, и дальше что? :)
М... Чуть больше контекста. Есть некий описанный схемой и прочим формат, который пользователи должны заполнять и подавать на вход числодробилке, которая его знает целимом. Формат жутко многоловный и кроме того не всем все операции можно делать. Поэтому есть производный от него упрощённый формат. Наша задача сконвертировать одно в другое, повалидировать, сделать какие-то специфические для нас вещи. Нюанс в том, что полной спецификации исходного формата у нас нет (и в общем целиком он нам не требуется). Часть тегов и аттрибутов из упрощённого просто должны быть перенесены в итоговый файл.
Самый лучший способ сохранить xml как есть это… сохранить его как xml, потоком байт, в блоб там или в файл
Ладно, но я не понимаю, в чем вопрос
Не, с сохранить нет вопросов. Вопросы с тем, как с этим работать. Грубо говоря, обработки могут быть такого плана: <Container><Element a="1" b="2"><Filter>...</Filter></Element></Container> Наша задча тут — найти все Element, посмотреть в Filter внутри, подёргать базу данных по запросу из Filter и каких-то атрибутов Element, получить оттуда список подходящего и сгенерировать такое: <Container><Element a="1" b="2" с="5" d="6"></Element><Element a="1" b="2" с="7" d="8"></Element></Container> c и d придут из базы, остальное переносится из исходного элемента. Беда, собственно, в том, что мы не очень в курсе, какие атрибуты вообще могут быть и какие у них возможные значения.
Надо выяснить, иначе код не напишешь
Если файл помещается в память — читаем в какой-нибудь lxml.etree, манипулируем данными про которые знаем, дампаем
Там сотни атрибутов и потенциальных комбинаций, которые контролируем не мы и которые на нас вообще никак не влияют, пока такой задачи не стоит. Была мысль налепить датаклассов для полного маппинга и следить за изменением схемы — но это нереально.
Я не понимаю вообще. Схему меняют постоянно?
Вот от одного гигантского ElementTree и хочется избавиться — крайне сложно следить за тем, что там вообще происходит.
В целом — да, часто.
Если программа сложна для понимания, то от написания 100500 моделей про чужой формат за которыми надо следить она понятнее не станет
Именно что хочется сделать модели для того, с чем мы непосредственно работать и какой-нибудь extra_attributes: dict для того, на что нам пофиг.
сделайте, но вместо extra_attributes пусть будет исходная хмл-ка как есть, строкой
Ну, строка тут не спасёт. Вложенности дофига.
ну хранить не куски напротив каждого аттрибута, а один раз исходный документ
Бр. А дёргать потом нужное из него как?
вот то что вам нужно xpath'ом достаньте и схороните уже в базу или куда вам там удобнее
Объясни, почему работать с постоянно изменяющейся схемой без датаклассов реально, а с датаклассами — нет?
Вопрос не в датаклассах как таковых а в классах в целом. Допустим, пришёл на вход тег: <Constants value1="1" value2="3" wtf="random_stuff"> На value1 и value2 у нас завязано куча расчётов по остальному документу, а что такое wtf — мы вообще не знаем и нам даже никто не сообщил, что его добавили, но сообщили пользователям, и в конечном xml это значение должно сохраниться. Мы делаем @dataclass class Constants: value1: int value2: int Куда нам запихнуть wtf?
NotRequired[wtf_type]
@dataclass class Constants: value1: int value2: int extra: dict[str, str]
unknown: Dict[str, Any]
Мы не знаем, какие поля вообще есть, чтобы так писать.
т.е. к ним не надо обращаться?
Вот что-то такое и думаю сделать в итоге. Но вопрос — как потом переводить их в известные, когда придёт тз "а вы знаете, мы тут добавили атрибут something, можно вы будете проверять, что он используется только совместно с такими-то тегами в другом углу xml".
Обсуждают сегодня