C++'tan XML'e Dönüştürücü
C++ struct veya class yapıştırın. Temiz XML geri alın.
Bu araç ne yapıyor
C# veya Java'nın aksine, C++ dahili bir XML serileştiricisine sahip değil. Bir struct veya class ile eşleşen bir XML payload'una ihtiyacınız varsa, ya XML'i elle yazarsınız, pugixml'i bağlarsınız, Xerces-C++'ı dahil edersiniz ya da Expat ile kurarsınız — ve hepsi daha bir test çalıştırmadan önce bir sürü yazma işi. C++'ınızı buraya yapıştırın, araç XML'i tek seferde çıkarır; her alan doğru yerinde.
Kodu bir insanın okuduğu gibi okur. C++20 designated initializer'lı bir struct Order { std::string orderId; std::vector<OrderItem> items; };, iç içe struct'lar inline açılmış halde <Order><orderId/><items><OrderItem/>...</items></Order> haline gelir. std::string değerleri doğru şekilde escape edilir (her zamanki &, <, >, ", '), sayısal tipler literal hallerini korur ve bool, true / false olarak çıkar; böylece çıktı, standartlara uygun herhangi bir XML okuyucunun beklediği herhangi bir şemaya karşı temiz parse edilir.
Container'lar elle yazacağınız şekle uyar. std::vector<T>, std::array ve düz C dizileri; her item için bir çocuk barındıran, element tipi adını taşıyan bir üst element olur. std::map ve std::unordered_map, <Entry><Key/><Value/></Entry> çiftleri yayar. nullopt tutan std::optional değerleri yok olmak yerine boş element olur — böylece şema round-trip'te tutarlı kalır. Bir constructor çağrısı, bir designated-initializer literali veya yalnızca tip tanımları yapıştırın; araç üçünü de halleder.
Nasıl kullanılır
Üç adım. Tek bir struct yapıştırsanız da koca bir header'ı örnek bir instance ile yapıştırsanız da çalışır.
C++'ınızı yapıştırın (veya örneği deneyin)
Sol editöre her türlü C++'ı atın — bir struct tanımı, metotlu bir class, bir designated initializer veya bir constructor çağrısı. #include header'ları, yorumlar ve using direktiflerini bırakabilirsiniz; parser şaşırmaz.
Örnek instance'lı temiz bir struct tercih ediyor musunuz? C++20 designated-initializer sözdizimini kullanan, iç içe OrderItem ve Address içeren gerçekçi bir Order için Örneği Yükle'ye tıklayın.
Dönüştür'e basın
Yeşil Dönüştür düğmesine tıklayın. Araç tipleri dolaşır, iç içe struct'ları açar ve XML'i yazar. Çalışırken kısa bir yükleme göstergesi döner — genellikle bir iki saniyeden az sürer.
XML'i kopyalayın
Sağ panel iyi biçimlendirilmiş, girintili XML ile dolar. Doğrudan bir SOAP isteğine, bir app.xml config dosyasına, bir unit test için std::ifstream fixture'ına ya da bir pugixml load_string testine kopyalayın — geçerli, escape edilmiş, kullanıma hazır.
Gerçekten işe yaradığı zamanlar
SOAP / web servis payload'larını prototiplemek
Legacy bir SOAP endpoint'i için C++ request struct'ınız var ve SoapUI veya curl'a atmak için gerçekçi bir XML body lazım. Struct'ı yapıştırın, XML'i alın, yolunuza devam edin.
pugixml / Xerces test fixture'ları hazırlamak
XML loader'ınızın unit testleri çeşitli iyi biçimlendirilmiş belgelere ihtiyaç duyar. Elle yazmak sıkıcı; gerçek struct'lardan üretmek fixture'ları test ettikleri tiplerle senkron tutar.
Koddan config template'leri oluşturmak
Ayarları XML'den okuyan bir oyun motoru, CAD aracı veya simülasyon; genellikle C++ tarafında bir Settings struct'ına sahiptir. Yapıştırın, release build için düzenlemeye hazır bir XML template'i alın — elle yazılmış boilerplate yok.
Legacy XML sistemlerine köprü kurmak
Finans, sağlık ve savunma stack'leri hâlâ XML konuşuyor. Yeni bir C++ servisi eski bir consumer'a XML mesajı çıkarmak zorunda kaldığında, bu araç gerçek serializer'ı bağlamadan önce şeklin nasıl olması gerektiğini gösterir.
Sık sorulan sorular
Birden fazla struct içeren koca bir header dosyasını yapıştırabilir miyim?
Evet. Header'ın tamamını yapıştırın — her struct veya class geçer, iç içe tipler inline açılır ve base class'lardan miras kalan public üyeler dahil edilir. Parser; yorumlar, preprocessor direktifleri ve forward declaration'lar konusunda hoşgörülüdür.
C++20 designated initializer'ları anlıyor mu?
Evet. Order order{ .orderId = "ORD-4821", .items = { ... } }; alan alan parse edilir, böylece XML yazdığınız isimleri korur. Eski tarz aggregate initialization (pozisyonel Order{ "ORD-4821", ... }) da struct tanımı aynı yapıştırmadaysa çalışır — araç pozisyonları alan adlarıyla eşleştirir. cppreference aggregate initialization'a bakın.
std::vector, std::map ve std::optional'ı nasıl ele alıyor?
std::vector<T>, std::array ve düz C dizileri; her item için bir çocuk barındıran, element tipi adını taşıyan bir container elementi olur. std::map / std::unordered_map, <Entry><Key/><Value/></Entry> çiftleri yayar. nullopt'lu std::optional, atılmak yerine boş element olur; böylece element şemada mevcut kalır.
Neden doğrudan pugixml veya libxml2 kullanmayalım?
Bunlar runtime serileştirme için harika; ancak ilk fixture'ı yazmak — ya da bir config template'i ya da bir dokümantasyon örneği — yine XML ağacını elle yazmak anlamına gelir. Bu araç size o ilk tur yazma işini kazandırır. Çıktıyı sonradan pugixml, Xerces-C++ veya RapidXML'e yönlendirebilirsiniz.
Kodum saklanıyor mu?
Kodunuz dönüşüm için backend'e gönderilir ve saklanmaz — payload'ı loglamıyoruz. Kod gerçekten hassassa (tescilli oyun motoru iç yapısı, trading modelleri vb.), herhangi bir çevrimiçi araçta yapacağınız gibi yapıştırmadan önce bir göz atın.
Peki C++'ta template, pointer veya smart pointer varsa?
std::vector<int> gibi somut template instantiation'ları doğrudan çalışır. Çözülmemiş template parametreleri (somut bir T'si olmayan template<typename T>) boş element olarak yayılır — gerçek veri istiyorsanız somut bir tip seçin. Ham pointer'lar ve std::unique_ptr/std::shared_ptr, işaret ettikleri nesneye kadar takip edilir; null pointer, tüm dönüşümü başarısız kılmak yerine boş element olur.
İşinize yarayabilecek diğer araçlar
C++'tan XML'e bulmacanın bir parçası. Bu araçlar onunla iyi gider: