Klistra in C++ till vänster och klicka på "Konvertera" — vi gör XML av detKlistra in C++-kod

Vad det här verktyget gör

Till skillnad från C# eller Java har C++ ingen inbyggd XML-serialiserare. Om du behöver en XML-payload som matchar en struct eller klass skriver du antingen XML för hand, kopplar in pugixml, drar in Xerces-C++, eller bygger det med Expat — och allt sånt är mycket knattrande innan du ens får köra ett test. Klistra in din C++ här och verktyget ger dig XML i ett svep, med varje fält på rätt plats.

Det läser koden som en människa läser den. En struct Order { std::string orderId; std::vector<OrderItem> items; }; med en C++20 designated initializer blir <Order><orderId/><items><OrderItem/>...</items></Order>, med nästlade structs inline-expanderade. std::string-värden escapas korrekt (de vanliga &, <, >, ", '), numeriska typer behåller sin literala form och bool kommer ut som true / false så att utdatat parsas rent mot vilket schema som helst som en standardtrogen XML-läsare förväntar sig.

Containrar följer den form du skulle skriva för hand. std::vector<T>, std::array och vanliga C-arrayer blir ett föräldraelement med ett barn per item, namngivet efter elementtypen. std::map och std::unordered_map släpper ut <Entry><Key/><Value/></Entry>-par. std::optional-värden som håller nullopt blir tomma element istället för att försvinna — så schemat förblir konsekvent genom round-trip. Klistra in ett konstruktoranrop, en designated-initializer-literal eller bara typdefinitionerna; verktyget klarar alla tre.

Hur du använder det

Tre steg. Fungerar vare sig du klistrar in en enda struct eller en hel header plus en exempelinstans.

1

Klistra in din C++ (eller testa exemplet)

Släng vilken C++ som helst i vänstra editorn — en struct-definition, en klass med metoder, en designated initializer eller ett konstruktoranrop. Du kan ta med #include-headrar, kommentarer och using-direktiv; parsern gör sig inte förvirrad.

Föredrar du en ren struct med en exempelinstans? Klicka på Ladda exempel för en realistisk Order med nästlade OrderItem och Address, i C++20 designated-initializer-syntax.

2

Tryck på Konvertera

Klicka på den gröna Konvertera-knappen. Verktyget vandrar igenom typerna, expanderar nästlade structs och skriver XML:en. Under tiden syns en kort laddningsindikator — oftast under en eller två sekunder.

3

Kopiera XML:en

Högra panelen fylls med välformad, indragen XML. Kopiera rakt in i en SOAP-request, en app.xml-konfigurationsfil, en std::ifstream-fixtur för ett enhetstest, eller ett pugixml-load_string-test — giltig, escapad och redo att användas.

När det verkligen är skönt att ha

Prototypa SOAP-/webbtjänst-payloads

Du har en C++-requeststruct för en legacy SOAP-endpoint och behöver en realistisk XML-body att släppa in i SoapUI eller curl. Klistra in structen, ta XML:en, vidare i nästa grej.

Mata pugixml-/Xerces-testfixturer

Enhetstesten för din XML-laddare behöver en variation av välformade dokument. Att skriva dem för hand är tråkigt; att generera dem från riktiga structs håller fixturerna i synk med typerna de testar.

Bygga konfigurationsmallar ur kod

En spelmotor, ett CAD-verktyg eller en simulering som läser inställningar från XML har oftast en Settings-struct på C++-sidan. Klistra in den, få en redigeringsklar XML-mall för release-builden — inget handknackat boilerplate.

Brygga mot legacy-XML-system

Finans-, vård- och försvarsstackar pratar fortfarande XML. När en ny C++-tjänst måste skicka ett XML-meddelande till en gammal konsument visar det här verktyget hur formen bör se ut innan du kopplar in den riktiga serialiseraren.

Vanliga frågor

Kan jag klistra in en hel headerfil med flera structs?

Ja. Klistra in hela headern — varje struct eller class kommer igenom, nästlade typer expanderas inline, och ärvda publika medlemmar från basklasser rullas in. Parsern är förlåtande mot kommentarer, preprocessor-direktiv och forward-deklarationer.

Förstår den C++20 designated initializers?

Ja. Order order{ .orderId = "ORD-4821", .items = { ... } }; parsas fält för fält, så XML:en bevarar namnen du skrev. Äldre aggregatsinitiering (positionell Order{ "ORD-4821", ... }) fungerar också när struct-definitionen finns i samma inklistring — verktyget kan då matcha positioner mot fältnamn. Se aggregate initialization på cppreference.

Hur hanterar den std::vector, std::map och std::optional?

std::vector<T>, std::array och vanliga C-arrayer blir ett container-element med ett barn per item, namngivet efter elementtypen. std::map / std::unordered_map släpper ut <Entry><Key/><Value/></Entry>-par. En std::optional med nullopt blir ett tomt element istället för att falla bort, så elementet stannar kvar i schemat.

Varför inte bara använda pugixml eller libxml2?

De är utmärkta för serialisering i runtime, men att skriva den första fixturen — eller en konfigurationsmall, eller ett dokumentationsexempel — betyder fortfarande att hacka ut XML-trädet för hand. Det här verktyget sparar dig den första knattrarundan. Du kan alltid köra utdatat genom pugixml, Xerces-C++ eller RapidXML efteråt.

Sparas min kod?

Din kod skickas till backend för konvertering och sparas inte — vi loggar inte payloaden. Om koden är äkta känslig (proprietära internals i en spelmotor, tradingmodeller etc.) så kör igenom den innan du klistrar in, precis som med vilket onlineverktyg som helst.

Hur är det om C++:en har templates, pekare eller smart pointers?

Konkreta template-instansieringar som std::vector<int> fungerar direkt. Olösta template-parametrar (template<typename T> utan ett konkret T) skickas ut som tomma element — välj en konkret typ om du vill ha riktig data. Råa pekare och std::unique_ptr/std::shared_ptr följs till det som pekas på; en nollpekare blir ett tomt element istället för att spräcka hela konverteringen.

Andra verktyg du kan behöva

C++ till XML är bara en bit av pusslet. De här verktygen passar bra ihop med det: