C++ til XML-konverter
Indsæt C++ structs eller klasser. Få ren XML tilbage.
Hvad værktøjet gør
I modsætning til C# eller Java har C++ ingen indbygget XML-serialiserer. Hvis du skal bruge en XML-payload, der matcher en struct eller klasse, så skriver du enten XML'en i hånden, kobler pugixml på, trækker Xerces-C++ ind, eller bygger det med Expat — og det hele er en masse tastning, før du overhovedet kan køre en test. Indsæt din C++ her, så giver værktøjet dig XML'en i ét hug, med hvert felt det rigtige sted.
Det læser koden, som et menneske ville gøre. En struct Order { std::string orderId; std::vector<OrderItem> items; }; med en C++20-designated initializer bliver til <Order><orderId/><items><OrderItem/>...</items></Order>, med indlejrede structs udfoldet inline. std::string-værdier bliver escaped korrekt (de sædvanlige &, <, >, ", '), numeriske typer beholder deres literal-form, og bool kommer ud som true / false, så outputtet parser rent mod ethvert skema, som en standard-overholdende XML-læser kan forvente.
Containere følger den form, du selv ville skrive i hånden. std::vector<T>, std::array og almindelige C-arrays bliver til et forælderelement med ét barn per item, navngivet efter elementtypen. std::map og std::unordered_map udsender <Entry><Key/><Value/></Entry>-par. std::optional-værdier, der holder nullopt, bliver tomme elementer i stedet for at forsvinde — så skemaet forbliver konsistent i round-trip. Indsæt et konstruktorkald, en designated-initializer-literal eller blot typedefinitionerne; værktøjet håndterer alle tre.
Sådan bruger du det
Tre trin. Virker både hvis du indsætter en enkelt struct eller en hel header plus en eksempelinstans.
Indsæt dit C++ (eller prøv eksemplet)
Smid hvad som helst C++ ind i editoren til venstre — en struct-definition, en klasse med metoder, en designated initializer eller et konstruktorkald. Du kan have #include-headers, kommentarer og using-direktiver med; parseren lader sig ikke forvirre.
Foretrækker du en ren struct med en eksempelinstans? Klik på Indlæs eksempel for en realistisk Order med indlejrede OrderItem og Address, i C++20-designated-initializer-syntaks.
Tryk på Konverter
Klik på den grønne Konverter-knap. Værktøjet går igennem typerne, udfolder de indlejrede structs og skriver XML'en. Mens det kører, vises en kort loadindikator — som regel under et sekund eller to.
Kopier XML'en
Højre panel fyldes med velformet, indrykket XML. Kopier den direkte ind i en SOAP-request, en app.xml-konfigurationsfil, en std::ifstream-fixture til en unit test, eller en pugixml-load_string-test — gyldig, escaped og klar til brug.
Hvornår det virkelig er rart at have
Prototype SOAP-/webservice-payloads
Du har en C++-request-struct til et legacy SOAP-endpoint og mangler en realistisk XML-body til SoapUI eller curl. Indsæt structen, snup XML'en, videre.
Seede pugixml-/Xerces-testfixtures
Unit tests til din XML-loader skal bruge et udvalg af velformede dokumenter. At skrive dem i hånden er trægt; at generere dem fra rigtige structs holder fixtures i synk med de typer, de tester.
Lave konfigurationstemplates ud fra kode
En spilmotor, et CAD-værktøj eller en simulering, der læser indstillinger fra XML, har typisk en Settings-struct på C++-siden. Indsæt den, få et redigeringsklart XML-template til release-builden — uden håndsnittet boilerplate.
Bygge bro til legacy-XML-systemer
Finans-, sundheds- og forsvarsstacks taler stadig XML. Når en ny C++-service skal udsende et XML-message til en gammel consumer, viser det her værktøj, hvordan formen bør se ud, før du kobler den rigtige serialiserer på.
Typiske spørgsmål
Kan jeg indsætte en hel header-fil med flere structs?
Ja. Indsæt hele headeren — hver struct eller class kommer igennem, indlejrede typer foldes ud inline, og nedarvede public-medlemmer fra basisklasser ruller med. Parseren er overbærende over for kommentarer, preprocessor-direktiver og forward-deklarationer.
Forstår den C++20-designated initializers?
Ja. Order order{ .orderId = "ORD-4821", .items = { ... } }; parses felt for felt, så XML'en bevarer de navne, du skrev. Ældre aggregat-initialisering (positionel Order{ "ORD-4821", ... }) virker også, når struct-definitionen ligger i samme indsættelse — værktøjet kan så matche positioner til feltnavne. Se aggregate initialization på cppreference.
Hvordan håndterer den std::vector, std::map og std::optional?
std::vector<T>, std::array og almindelige C-arrays bliver til et container-element med ét barn per item, navngivet efter elementtypen. std::map / std::unordered_map udsender <Entry><Key/><Value/></Entry>-par. En std::optional med nullopt bliver et tomt element i stedet for at blive droppet, så elementet bliver stående i skemaet.
Hvorfor ikke bare bruge pugixml eller libxml2?
De er fine til runtime-serialisering, men at skrive den første fixture — eller et konfigurationstemplate, eller et docs-eksempel — betyder stadig, at du skal banke XML-træet ud i hånden. Det her værktøj sparer dig den første omgang tastning. Du kan altid køre outputtet videre gennem pugixml, Xerces-C++ eller RapidXML bagefter.
Bliver min kode gemt?
Din kode sendes til backenden til konvertering og bliver ikke persisteret — vi logger ikke payloaden. Hvis koden er virkelig følsom (proprietære spilmotor-internals, tradingmodeller osv.), så kør den lige igennem før du indsætter, ligesom med ethvert andet onlineværktøj.
Hvad hvis C++'en har templates, pointers eller smart pointers?
Konkrete template-instansieringer som std::vector<int> virker direkte. Ikke-opløste template-parametre (template<typename T> uden et konkret T) kommer ud som tomme elementer — vælg en konkret type, hvis du vil have rigtige data. Rå pointers og std::unique_ptr/std::shared_ptr følges til det, de peger på; en null-pointer bliver et tomt element i stedet for at vælte hele konverteringen.
Andre værktøjer, du måske får brug for
C++ til XML er bare én brik i puslespillet. De her værktøjer passer godt sammen med det: