Indsæt C++ til venstre og klik på "Konverter" — vi laver XML ud af detIndsæt C++-kode

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.

1

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.

2

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.

3

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: