#include <stdio.h>
#include <stdlib.h>
#include "../include/tinyxml2.h"
static struct TxNodeId add_text_element(TxDocument *doc,
struct TxNodeId parent,
const char *tag,
const char *text)
{
struct TxNodeId el = tx_new_element(doc, tag);
struct TxNodeId txt = tx_new_text(doc, text);
tx_insert_end_child(doc, el, txt);
tx_insert_end_child(doc, parent, el);
return el;
}
int main(void)
{
TxDocument *doc = tx_document_new();
if (!doc) {
fprintf(stderr, "Error: failed to allocate document\n");
return EXIT_FAILURE;
}
struct TxNodeId root = tx_root_element(doc);
struct TxNodeId config = tx_new_element(doc, "config");
tx_element_set_attribute(doc, config, "version", "1.0");
{
struct TxNodeId decl = tx_new_declaration(doc, "xml version=\"1.0\" encoding=\"UTF-8\"");
struct TxNodeId tmp = tx_new_element(doc, "_");
tx_document_parse(doc, "<_/>");
struct TxNodeId tmp_root = tx_root_element(doc);
struct TxNodeId doc_node = tx_parent(doc, tmp_root);
tx_document_clear(doc);
(void)tmp;
(void)decl;
(void)doc_node;
}
tx_document_parse(doc, "<?xml version=\"1.0\" encoding=\"UTF-8\"?><config/>");
config = tx_root_element(doc);
tx_element_set_attribute(doc, config, "version", "1.0");
struct TxNodeId database = tx_new_element(doc, "database");
tx_element_set_attribute(doc, database, "id", "primary");
tx_insert_end_child(doc, config, database);
add_text_element(doc, database, "host", "localhost");
add_text_element(doc, database, "port", "5432");
add_text_element(doc, database, "name", "myapp_production");
struct TxNodeId creds = tx_new_element(doc, "credentials");
tx_insert_end_child(doc, database, creds);
add_text_element(doc, creds, "user", "admin");
{
struct TxNodeId pw = add_text_element(doc, creds, "password", "s3cr3t");
tx_element_set_attribute(doc, pw, "encrypted", "true");
}
struct TxNodeId pool = tx_new_element(doc, "pool");
tx_insert_end_child(doc, config, pool);
add_text_element(doc, pool, "min_connections", "5");
add_text_element(doc, pool, "max_connections", "20");
add_text_element(doc, pool, "timeout_seconds", "30");
printf("── DOM serialisation (pretty-printed) ──\n");
const char *pretty = tx_document_to_string(doc);
if (pretty) {
printf("%s\n", pretty);
}
printf("── DOM serialisation (compact) ──────────\n");
const char *compact = tx_document_to_string_compact(doc);
if (compact) {
printf("%s\n\n", compact);
}
printf("── Printer API output ──────────────────\n");
TxPrinter *printer = tx_printer_new();
if (!printer) {
fprintf(stderr, "Error: failed to allocate printer\n");
tx_document_free(doc);
return EXIT_FAILURE;
}
tx_printer_open_element(printer, "config");
tx_printer_push_attribute(printer, "version", "1.0");
tx_printer_open_element(printer, "database");
tx_printer_push_attribute(printer, "id", "primary");
tx_printer_open_element(printer, "host");
tx_printer_push_text(printer, "localhost");
tx_printer_close_element(printer);
tx_printer_open_element(printer, "port");
tx_printer_push_text(printer, "5432");
tx_printer_close_element(printer);
tx_printer_open_element(printer, "name");
tx_printer_push_text(printer, "myapp_production");
tx_printer_close_element(printer);
tx_printer_push_comment(printer, " credentials section ");
tx_printer_open_element(printer, "credentials");
tx_printer_open_element(printer, "user");
tx_printer_push_text(printer, "admin");
tx_printer_close_element(printer);
tx_printer_open_element(printer, "password");
tx_printer_push_attribute(printer, "encrypted", "true");
tx_printer_push_text(printer, "s3cr3t");
tx_printer_close_element(printer);
tx_printer_close_element(printer);
tx_printer_close_element(printer);
tx_printer_open_element(printer, "pool");
tx_printer_open_element(printer, "min_connections");
tx_printer_push_text(printer, "5");
tx_printer_close_element(printer);
tx_printer_open_element(printer, "max_connections");
tx_printer_push_text(printer, "20");
tx_printer_close_element(printer);
tx_printer_open_element(printer, "timeout_seconds");
tx_printer_push_text(printer, "30");
tx_printer_close_element(printer);
tx_printer_close_element(printer);
tx_printer_close_element(printer);
const char *printer_out = tx_printer_result(printer);
if (printer_out) {
printf("%s\n", printer_out);
}
tx_printer_free(printer);
tx_document_free(doc);
printf("\nDone.\n");
return EXIT_SUCCESS;
}