XML в структуру C и структуру C в XML

Мне нравится программировать на стороне сервера на C, но мне нужно взаимодействовать с некоторыми XML.

Что мне нужно написать, так это какую-то функцию, которая, учитывая структуру C или вложенную структуру и другую структуру (или вложенные структуры), описывающую элементы в структуре C, выдает ее в виде XML. И еще одна функция, которая читает XML, проверяет, соответствует ли он описанию структур C, и заполняет структуры C.

Я вполне уверен, что это уже делалось много раз, но существует так много другой информации об XML, что мне не удается составить запрос Google, который не возвращает много несвязанных вещей.

Я не ищу библиотеку — всего несколько сотен строк кода на C для разбора XML.


person Matthias Wandel    schedule 08.05.2009    source источник
comment
Согласитесь, что C — не лучший выбор для совершенно нового веб-приложения, но что, если у него есть хорошо зарекомендовавшая себя кодовая база? Мы не всегда можем позволить себе роскошь начинать сначала, даже если это облегчит нам жизнь в долгосрочной перспективе.   -  person snowcrash09    schedule 09.05.2009
comment
Потому что иногда мои материалы попадают на первые страницы таких сайтов, как digg.com, и мне не очень хочется тратить много денег на мощный хостинг. Это также действительно сокращает количество зависимостей, что хорошо, когда кто-то лицензирует код (что также происходит время от времени). Но согласен - каждый раз, когда вы начинаете часто вызывать malloc(), C - не тот язык. Вот почему я обычно делаю свои строки фиксированной длины и избегаю malloc.   -  person Matthias Wandel    schedule 10.05.2009
comment
Я предполагаю, что на самом деле нет чего-то легкодоступного, что я мог бы использовать, поэтому я написал простой анализатор XML на C. Его достаточно только для моих нужд, но это также всего 350 строк кода на C.   -  person Matthias Wandel    schedule 21.05.2009
comment
Написание синтаксического анализатора XML на C??? Очень странная идея. Уже есть несколько очень хороших. См. stackoverflow.com/questions/399704/xml-parser-for-c.   -  person bortzmeyer    schedule 21.05.2009
comment
Я не был готов включать множество зависимостей и библиотек, которые более чем удвоили бы размер моего проекта.   -  person Matthias Wandel    schedule 30.09.2010
comment
@JoshPetitt Определенно есть ситуации, в которых C является отличным выбором, но ОП намекнул, что его не вынуждают использовать для этого проекта, начав свой вопрос с нравится для программирования на стороне сервера на C, в отличие от того, что я должен использовать C для этого проекта. Я не пытался начать языковую войну и мог бы сформулировать свой первый комментарий менее конфронтационным образом. Извините, если наткнулся не на тот путь.   -  person William Brendel    schedule 19.02.2013
comment
@WilliamBrendel, нет проблем, наверное, я тоже был слишком резок. Я удаляю свой оригинальный комментарий.   -  person Josh Petitt    schedule 19.02.2013
comment
@WilliamBrendel, а как насчет небольших целей, таких как встроенная система? Я хотел бы создавать и анализировать XML с более полнофункционального веб-сервера, но у меня нет ресурсов и встроенных функций более полнофункционального веб-сервера. Что, если C — единственный вариант?   -  person Josh Petitt    schedule 19.02.2013


Ответы (3)


Он не просит синтаксический анализатор XML. Он просит библиотеку, которая автоматически сериализует/десериализует сложную структуру C в XML и обратно (что, очевидно, будет опираться на синтаксический анализатор XML внизу).

Libpdel устарела, но поддерживает то, что вы хотите (через "структуры") .

person Archie    schedule 10.02.2011

Один из способов сделать это, если вы не найдете готовых библиотек или кода, — написать функцию toXML(), аналогичную обычным функциям toString(). Затем toStruct(char*), который десериализует XML обратно в структуру

person ThePosey    schedule 08.05.2009
comment
Да что-то подобное. И это то, что я надеюсь избежать написания, если есть код, который делает это. - person Matthias Wandel; 09.05.2009

В общем случае вы не сможете разобрать XML всего за несколько сотен строк кода. Существует несколько библиотек парсеров XML, из которых на ум приходит expat. Expat был написан на C и имеет дружественный к C API.

Сериализация, вероятно, будет проще, если вы не сходите с ума от поддерживаемых типов данных.

В любом случае, где это вызовет у вас головную боль, так это в поддержании соответствия между макетом struct и схемой XML.

Возможно, вы захотите изучить библиотеки, такие как SCEW, которые призваны скрыть управляемую событиями природу реализации expat. и представить что-то более похожее на дерево DOM. Существуют также различные библиотеки, которые реализуют SOAP поверх expat, и им обязательно нужно обрабатывать маршалинг данных в пакетах XML и из них.

person RBerteig    schedule 09.05.2009
comment
Что ж, синтаксический анализ XML — это простая часть (и есть много библиотек, которые проще, чем expat, такие как libxml). Трудная часть — это двустороннее сопоставление/преобразование между структурами C и XML. - person bortzmeyer; 11.05.2009
comment
Хорошая сериализация всегда сложнее, чем кажется, независимо от того, какой протокол используется. ИМХО, XML делает хорошую сериализацию еще труднее, но это только из моего личного опыта. Ваш пробег будет варьироваться, вероятно, значительно. - person RBerteig; 12.05.2009
comment
@RBerteig, у вас есть ресурсы для макета структуры и схемы XML? Я считаю, что это суть вопроса (и моего тоже). В идеале я ищу подмножество XML, которое всегда будет отображаться на структуру C и наоборот. Я понимаю, что XML-документ и структура C принципиально отличаются. Тем не менее, я надеюсь найти точки соприкосновения между ними, которые можно было бы использовать в качестве спецификации. - person Josh Petitt; 17.02.2013
comment
@JoshPetitt, у меня нет ресурсов навскидку. Я бы начал с сопоставления простого struct с тегом с атрибутами. Это хорошо работает для таких вещей, как struct point{ int x; int y; }, которые можно записать как <point x='5' y='17'>. Это работает для POD без указателей и типов данных, которые можно записать (очень) простым текстом. Другой тег можно использовать для сбора массивов. Это становится более интересным, когда вам нужно представить произвольные строковые данные, структуры, отличные от дерева, вообще указатели и т. д.... не забывайте также о проблемах безопасности. Безопасная сериализация — это сложно. - person RBerteig; 18.02.2013
comment
@RBerteig, спасибо за советы. Я хорошо разбираюсь в C, но не настолько хорошо знаком с XML (мои знания XML в основном практические, практические). Я надеялся, что эксперт по XML предоставит схему, по которой я мог бы закодировать свое приложение на C. Я не использую XML на сервере или что-либо, что использует DTD. - person Josh Petitt; 18.02.2013
comment
@JoshPetitt Это может быть случай, когда JSON может быть лучшим ответом, если у вас нет внешнего требования, которое удовлетворяется только XML. Существует несколько библиотек C для JSON, и формат достаточно прост, чтобы его могли читать люди, поскольку он представляет собой тщательно подобранное подмножество представления javascript для структурированных данных. Есть много вопросов SO, связанных с JSON и его использованием. - person RBerteig; 19.02.2013
comment
@RBerteig, да, я также поддерживаю JSON, что НАМНОГО проще, потому что есть довольно простое сопоставление и сходство в синтаксисе. Кроме того, JSON — это структурированные данные, а не документ (AFAIK), что также упрощает концепцию. Спасибо за предложение. - person Josh Petitt; 19.02.2013
comment
Хороший ответ, хотя я не согласен с вашим утверждением о том, что для анализа XML требуется много усилий. - person CoffeeTableEspresso; 26.03.2019