Konwerter C do XML
Wklej struct-y C albo typedef-y. Dostaniesz czysty XML.
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.
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.
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.
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: