Lim inn C++ til venstre og klikk "Konverter" — vi gjør det om til XMLLim inn C++-kode

Hva verktøyet gjør

I motsetning til C# eller Java har C++ ingen innebygd XML-serialiserer. Trenger du en XML-payload som matcher en struct eller klasse, skriver du enten XML-en for hånd, kobler på pugixml, drar inn Xerces-C++, eller bygger den med Expat — og alt sammen er masse tastearbeid før du i det hele tatt får kjørt en test. Lim inn C++-en din her, så gir verktøyet deg XML-en i én slepp, med hvert felt på rett plass.

Det leser koden slik et menneske gjør det. En struct Order { std::string orderId; std::vector<OrderItem> items; }; med en C++20-designated initializer blir til <Order><orderId/><items><OrderItem/>...</items></Order>, med nestede structs foldet ut inline. std::string-verdier blir escapet riktig (de vanlige &, <, >, ", '), numeriske typer beholder den literale formen sin, og bool kommer ut som true / false, slik at utdataet parses rent mot et hvilket som helst skjema en standardtro XML-leser forventer.

Containere følger den formen du selv ville skrevet for hånd. std::vector<T>, std::array og vanlige C-arrayer blir til et foreldreelement med ett barn per element, navngitt etter elementtypen. std::map og std::unordered_map sender ut <Entry><Key/><Value/></Entry>-par. std::optional-verdier som holder nullopt blir tomme elementer i stedet for å forsvinne — slik at skjemaet forblir konsistent i round-trip. Lim inn et konstruktørkall, en designated-initializer-literal eller bare typedefinisjonene; verktøyet takler alle tre.

Sånn bruker du det

Tre steg. Funker enten du limer inn én struct eller en hel header pluss en eksempelinstans.

1

Lim inn C++-en din (eller prøv eksempelet)

Slenger du hva som helst av C++ inn i venstre editor — en struct-definisjon, en klasse med metoder, en designated initializer eller et konstruktørkall. Du kan ha med #include-headere, kommentarer og using-direktiver; parseren blir ikke forvirret.

Foretrekker du en ren struct med en eksempelinstans? Klikk på Last inn eksempel for en realistisk Order med nestede OrderItem og Address, i C++20-designated-initializer-syntaks.

2

Trykk på Konverter

Klikk på den grønne Konverter-knappen. Verktøyet går gjennom typene, folder ut nestede structs og skriver XML-en. Mens det jobber dukker det opp en kort lasteindikator — som regel under ett eller to sekunder.

3

Kopier XML-en

Høyre panel fylles opp med velformet, innrykket XML. Kopier rett inn i en SOAP-request, en app.xml-konfigfil, en std::ifstream-fixture til en enhetstest, eller en pugixml-load_string-test — gyldig, escapet og klar til bruk.

Når det faktisk kommer godt med

Prototype SOAP-/web service-payloads

Du har en C++-request-struct for en legacy SOAP-endpoint og trenger en realistisk XML-body å dumpe inn i SoapUI eller curl. Lim inn structen, ta XML-en, gå videre.

Fôre pugixml-/Xerces-testfixturer

Enhetstestene til XML-loaderen din trenger et knippe velformede dokumenter. Å skrive dem for hånd er kjedelig; å generere dem fra ekte structs holder fixturene i takt med typene de tester.

Bygge konfigurasjonsmaler ut fra kode

En spillmotor, et CAD-verktøy eller en simulering som leser innstillinger fra XML har som regel en Settings-struct på C++-siden. Lim den inn, få en redigeringsklar XML-mal til release-builden — ingen håndbanket boilerplate.

Bygge bro til legacy-XML-systemer

Stacker innen finans, helse og forsvar snakker fortsatt XML. Når en ny C++-tjeneste må sende ut en XML-melding til en gammel konsument, viser dette verktøyet deg hvordan formen burde se ut før du kobler på den egentlige serialisereren.

Vanlige spørsmål

Kan jeg lime inn en hel header-fil med flere structs?

Ja. Lim inn hele headeren — hver struct eller class kommer gjennom, nestede typer foldes ut inline, og arvede public-medlemmer fra baseklasser rulles med. Parseren er overbærende med kommentarer, preprosessor-direktiver og forward-deklarasjoner.

Forstår den C++20-designated initializers?

Ja. Order order{ .orderId = "ORD-4821", .items = { ... } }; parses felt for felt, så XML-en beholder navnene du skrev. Eldre aggregat-initialisering (posisjonell Order{ "ORD-4821", ... }) funker også når struct-definisjonen ligger i samme innliming — da kan verktøyet matche posisjoner til feltnavn. Se aggregate initialization på cppreference.

Hvordan håndterer den std::vector, std::map og std::optional?

std::vector<T>, std::array og vanlige C-arrayer blir til et container-element med ett barn per element, navngitt etter elementtypen. std::map / std::unordered_map sender ut <Entry><Key/><Value/></Entry>-par. En std::optional med nullopt blir et tomt element heller enn å droppes, så elementet blir stående i skjemaet.

Hvorfor ikke bare bruke pugixml eller libxml2?

De er topp til serialisering i runtime, men å skrive den første fixturen — eller en konfigmal, eller et docs-eksempel — betyr fortsatt at du banker ut XML-treet for hånd. Dette verktøyet sparer deg for den første tasterunden. Du kan alltid kjøre utdataet videre gjennom pugixml, Xerces-C++ eller RapidXML etterpå.

Blir koden min lagret?

Koden din sendes til backenden for konvertering og lagres ikke — vi logger ikke payloaden. Hvis koden er skikkelig sensitiv (proprietære spillmotor-internals, tradingmodeller osv.), så se gjennom den før du limer inn, slik du ville gjort med hvilket som helst nettverktøy.

Hva om C++-en har templates, pekere eller smart pointers?

Konkrete template-instansieringer som std::vector<int> funker rett ut av boksen. Uløste template-parametre (template<typename T> uten en konkret T) sendes ut som tomme elementer — velg en konkret type hvis du vil ha ekte data. Rå pekere og std::unique_ptr/std::shared_ptr følges til det som pekes på; en null-peker blir et tomt element heller enn å velte hele konverteringen.

Andre verktøy du kan få bruk for

C++ til XML er bare én brikke i puslespillet. Disse verktøyene passer godt sammen med det: