Convertitore C++ in XML
Incolla struct o classi C++. Ottieni XML pulito.
Cosa fa questo strumento
A differenza di C# o Java, C++ non ha un serializzatore XML incorporato. Se ti serve un payload XML che combaci con uno struct o una classe, o scrivi l'XML a mano, o colleghi pugixml, o tiri dentro Xerces-C++, o lo costruisci con Expat — e in tutti i casi è un sacco di battitura prima ancora di poter far girare un test. Incolla qui il C++ e lo strumento ti sputa fuori l'XML in una passata, con ogni campo al posto giusto.
Legge il codice come lo leggerebbe una persona. Uno struct Order { std::string orderId; std::vector<OrderItem> items; }; con un designated initializer C++20 diventa <Order><orderId/><items><OrderItem/>...</items></Order>, con gli struct annidati espansi inline. I valori std::string vengono escapati correttamente (i soliti &, <, >, ", '), i tipi numerici conservano la loro forma letterale e bool esce come true / false, così l'output parsa pulito contro qualsiasi schema che un reader XML conforme allo standard si aspetti.
I container seguono la forma che scriveresti a mano. std::vector<T>, std::array e gli array C semplici diventano un elemento padre con un figlio per item, dal nome del tipo dell'elemento. std::map e std::unordered_map emettono coppie <Entry><Key/><Value/></Entry>. Gli std::optional che contengono nullopt diventano elementi vuoti invece di sparire — così lo schema resta coerente nel round-trip. Incolla una chiamata a costruttore, un literal con designated initializer o solo le definizioni di tipo; lo strumento gestisce tutti e tre.
Come si usa
Tre passi. Funziona sia se incolli un singolo struct sia se incolli un intero header più un'istanza di esempio.
Incolla il tuo C++ (o prova l'esempio)
Butta qualsiasi C++ nell'editor di sinistra — una definizione di struct, una classe con metodi, un designated initializer o una chiamata a costruttore. Puoi includere header #include, commenti e direttive using; non confondono il parser.
Preferisci uno struct pulito con un'istanza di esempio? Clicca Carica esempio per un Order realistico con OrderItem e Address annidati, usando la sintassi designated initializer di C++20.
Premi Converti
Clicca il pulsante verde Converti. Lo strumento percorre i tipi, espande gli struct annidati e scrive l'XML. Mentre lavora appare un breve indicatore di caricamento — di solito meno di uno o due secondi.
Copia l'XML
Il pannello di destra si riempie di XML ben formato e indentato. Copialo direttamente in una richiesta SOAP, in un file di configurazione app.xml, in una fixture std::ifstream per un unit test, o in un test load_string di pugixml — è valido, escapato e pronto all'uso.
Quando serve davvero
Prototipare payload SOAP / web service
Hai uno struct C++ di richiesta per un endpoint SOAP legacy e ti serve un body XML realistico da ficcare in SoapUI o curl. Incolla lo struct, prenditi l'XML, avanti.
Popolare fixture di test per pugixml / Xerces
Gli unit test del tuo loader XML hanno bisogno di una varietà di documenti ben formati. Scriverli a mano è una rottura; generarli da struct reali tiene le fixture allineate ai tipi che esercitano.
Costruire template di configurazione dal codice
Un motore di gioco, uno strumento CAD o una simulazione che legge impostazioni da XML di solito ha uno struct Settings lato C++. Incollalo, ottieni un template XML pronto da editare per la release — niente boilerplate fatto a mano.
Fare da ponte verso sistemi XML legacy
Gli stack di finanza, sanità e difesa parlano ancora XML. Quando un nuovo servizio C++ deve emettere un messaggio XML per un consumer vecchio, questo strumento ti mostra che forma deve avere prima che tu colleghi il serializzatore vero.
Domande frequenti
Posso incollare un intero file header con più struct?
Sì. Incolla l'header completo — ogni struct o class passa, i tipi annidati vengono espansi inline, e i membri public ereditati dalle classi base vengono inclusi. Il parser è indulgente con commenti, direttive del preprocessore e forward declaration.
Capisce i designated initializer di C++20?
Sì. Order order{ .orderId = "ORD-4821", .items = { ... } }; viene parsato campo per campo, quindi l'XML conserva i nomi che hai scritto. Anche l'inizializzazione aggregata vecchio stile (posizionale Order{ "ORD-4821", ... }) funziona quando la definizione dello struct è nello stesso paste — lo strumento riesce ad accoppiare posizioni e nomi di campo. Vedi aggregate initialization su cppreference.
Come gestisce std::vector, std::map e std::optional?
std::vector<T>, std::array e gli array C semplici diventano un elemento container con un figlio per item, dal nome del tipo dell'elemento. std::map / std::unordered_map emettono coppie <Entry><Key/><Value/></Entry>. Uno std::optional con nullopt diventa un elemento vuoto invece di essere eliminato, così l'elemento resta presente nello schema.
Perché non usare semplicemente pugixml o libxml2?
Sono ottime per la serializzazione a runtime, ma scrivere la prima fixture — o un template di config, o un esempio per la documentazione — significa comunque digitare l'albero XML a mano. Questo strumento ti risparmia quel primo giro di battitura. Puoi sempre far passare l'output dentro pugixml, Xerces-C++ o RapidXML dopo.
Il mio codice viene salvato?
Il tuo codice viene inviato al backend per la conversione e non viene persistito — non logghiamo il payload. Se il codice è davvero sensibile (internals proprietari di un motore di gioco, modelli di trading, ecc.), dagli un'occhiata prima di incollarlo, come faresti con qualsiasi strumento online.
E se il C++ ha template, puntatori o smart pointer?
Le istanziazioni concrete di template come std::vector<int> funzionano subito. I parametri di template non risolti (template<typename T> senza una T concreta) vengono emessi come elementi vuoti — scegli un tipo concreto se vuoi dati veri. I puntatori raw e gli std::unique_ptr/std::shared_ptr vengono seguiti fino all'oggetto puntato; un puntatore nullo diventa un elemento vuoto invece di far fallire l'intera conversione.
Altri strumenti che ti possono servire
C++ in XML è un pezzo del puzzle. Questi strumenti ci stanno bene insieme: