Wklej C po lewej i kliknij "Konwertuj" — zamieniamy to na XMLWklej kod C

Co robi to narzędzie

C nie ma wbudowanego serializatora XML. Jeśli chcesz dokument XML, który odzwierciedla typedef struct, zwykle sięgasz po libxml2, Expat, albo wyklepujesz rzecz znak po znaku. Wklej tu swoje C i pomijasz tę pierwszą rundę klepania — narzędzie wypluwa poprawny XML, który pasuje do pól, typów zagnieżdżonych i tablic, które zdefiniowałeś.

Czyta prawdziwe C, nie jakiś zabawkowy podzbiór. typedef struct { char orderId[16]; double totalAmount; OrderItem items[2]; } Order; razem z designated initializerem C99/C11 (Order o = { .orderId = "ORD-4821", ... };) zamienia się w pełne drzewo <Order>...</Order>, w którym każdy member jest elementem potomnym. Tablice char o stałym rozmiarze traktowane są jako stringi (nie tablice bajtów), typy liczbowe zachowują postać literalną, a bool z <stdbool.h> w wyniku wychodzi jako true / false.

Tablice i zagnieżdżone struct-y wychodzą tak, jak napisałbyś je ręcznie. OrderItem items[2] staje się <items><OrderItem/><OrderItem/></items>, z każdym elementem rozpisanym. Zagnieżdżone typedef-y są rozwiązywane do rzeczywistego layoutu, więc alias MoneyAmount dla double i tak daje wartość liczbową, a nie wiszące odwołanie. Wskaźniki bez inicjalizatora stają się pustymi elementami, a nie znikają po cichu — wygodne, jeśli używasz wyjścia jako szablonu schematu dla serwisu zbudowanego na GCC, który nadal gada XML-em ze starszymi konsumentami.

Jak tego używać

Trzy kroki. Działa, czy wkleisz pojedynczy typedef, czy cały nagłówek razem z inicjalizatorem.

1

Wklej swoje C (albo spróbuj przykładu)

Wrzuć dowolne C do lewego edytora — typedef struct, zwykły struct, designated initializer albo mieszankę. Dyrektywy #include, komentarze i makra #define są OK; zostaw je.

Wolisz czysty przykład? Kliknij Załaduj przykład, żeby dostać realistyczny typedef Order z zagnieżdżonymi OrderItem i Address, zainicjalizowany składnią designated initializer C99.

2

Kliknij Konwertuj

Kliknij zielony przycisk Konwertuj. Narzędzie przechodzi po struct-ach, rozwiązuje typedef-y, rozwija typy zagnieżdżone i tablice, i zapisuje XML w jednym przebiegu. W trakcie pojawia się krótki wskaźnik ładowania.

3

Skopiuj XML

Prawy panel wypełnia się poprawnym, wcięciowanym XML-em. Skopiuj go do fixture testowego libxml2, do pliku konfiguracyjnego, który firmware czyta przy starcie, do testu callbacka Expat albo do dokumentacji.

Kiedy to realnie się przydaje

Szablony konfiguracji dla embedded / firmware

Bootloadery i urządzenia przemysłowe często czytają konfigurację XML z flasha albo karty SD. Wklej struct C opisujący konfigurację, dostaniesz edytowalny szablon XML pasujący do layoutu bajt po bajcie.

Fixtury testowe dla libxml2 / Expat

Ręczne klepanie przykładowego XML-a do każdego testu parsera szybko męczy. Wygeneruj fixtury z prawdziwych typedef-ów, które parser hydratuje — fixtury i typy zostają zsynchronizowane.

Rozmowa z legacy systemami XML

Serwisy w C w telekomach, obronności i ochronie zdrowia wciąż wymieniają XML z systemami partnerów. Kiedy nowy struct musi iść po drucie, to narzędzie pokazuje ci dokładny kształt, zanim napiszesz serializator.

Dokumentacja i przykłady schematów

Sekcje README i API reference pokazujące "typową wiadomość" łatwiej trzymać aktualnie, jeśli przykład jest generowany z prawdziwego nagłówka. Nie ma dryfu między tym, co czyta kod, a tym, co obiecuje dokumentacja.

Częste pytania

Czy mogę wkleić cały nagłówek z wieloma typedef-ami?

Tak. Wklej pełny nagłówek — każdy typedef struct jest wyłapywany, typy zagnieżdżone rozwijają się inline, a typy zadeklarowane z wyprzedzeniem są rozwiązywane, kiedy ich definicja pojawi się dalej w wklejonym tekście. Do celów layoutu #include, #define i komentarze są ignorowane.

Czy rozumie designated initializery z C99 / C11?

Tak. Order o = { .orderId = "ORD-4821", .items = { ... } }; jest parsowany po nazwie pola, więc nazwy elementów XML zgadzają się z tym, co napisałeś. Pozycyjne inicjalizatory agregatowe też działają, kiedy definicja struct-a jest w tym samym wklejonym tekście — narzędzie dopasowuje pozycje do zadeklarowanej kolejności członków. Zobacz sekcję 6.7.9 standardu C11.

Jak traktuje tablice char, enumy i uniony?

Tablice char o stałym rozmiarze są renderowane jako stringi (to konwencja w praktycznie każdej prawdziwej bazie kodu C), nie jako lista liczb. Wartości enum są wypisywane jako nazwa enumeratora, a nie liczba, żeby wynik był czytelny. Członkowie union wychodzą jako ostatnio przypisany wariant, jeśli designated initializer to jasno pokazuje, albo jako pusty element z komentarzem, jeśli aktywny wariant jest niejednoznaczny.

Czemu nie użyć po prostu libxml2 albo Expat?

Te biblioteki są solidne do serializacji w runtime, ale napisanie pierwszej fixture albo pierwszego szablonu konfiguracji ręcznie i tak kosztuje czas. To narzędzie ci go oszczędza. Jak już masz poprawny kształt XML-a, podepnij libxml2 albo Expat na ścieżce produkcyjnej.

Czy mój kod jest gdzieś zapisywany?

Twój kod jest wysyłany do backendu na potrzeby konwersji i nie jest przechowywany — nie logujemy payloadu. Jak zawsze, jeśli źródło jest wrażliwe (własnościowy protokół, firmware krytyczny dla bezpieczeństwa itd.), przejrzyj go przed wklejeniem.

A co, jeśli w C są wskaźniki, wskaźniki do funkcji albo typy opaque?

Wskaźniki do obiektu z inicjalizatorem są śledzone aż do wskazywanego obiektu. Niezainicjalizowane wskaźniki, wskaźniki do funkcji i typy opaque (struct Foo* bez widocznej definicji) są wypisywane jako puste elementy, zamiast wywalić całą konwersję. To odpowiada temu, jak sam napisałbyś ręcznie dokument XML dla struct-a, którego cel wskaźnika nie jest częścią serializowanego payloadu.

Inne narzędzia, które mogą ci się przydać

C do XML to tylko jeden element układanki. Te pasują do niego: