Sample code for 30+ languages & platforms
Zig

XML Document References

See more XML Examples

This example demonstrates the fact that the entire XML document remains in memory if at least one node is referenced. (It does not need to be the root node.)

Chilkat Zig Downloads

Zig
const std = @import("std");
const chilkat = @import("chilkat");

pub fn main(init: std.process.Init) !void {
    const alloc = init.arena.allocator();

    const xml = try chilkat.Xml.init();
    defer xml.deinit();

    try xml.loadXml("<a><b>BBB</b><c>CCC</c></a>");

    std.debug.print("{s}\n", .{try xml.getXml(alloc)});

    // We have the following XML stored in memory:

    //     <?xml version="1.0" encoding="utf-8"?>
    //     <a>
    //         <b>BBB</b>
    //         <c>CCC</c>
    //     </a>

    // Get a reference to the 1st child.
    const x_b = try xml.getChild(0);
    defer x_b.deinit();

    // Re-load "xml" with an entirely new document:
    try xml.loadXml("<z><x>XXX</x></z>");

    // What happens to xB?
    // The answer is nothing.  xB still points ot the "b" node in the original document, and the entire
    // original document remains in memory.  We now have two XML documents in memory.

    std.debug.print("{s}\n", .{try x_b.getXml(alloc)});

    // output is:

    //     <b>BBB</b>

    // Make xB reference the root node of its document:
    x_b.getRoot2();
    std.debug.print("{s}\n", .{try x_b.getXml(alloc)});

    // You can see here that the entire original XML document is still available
    // because at least one node in the XML is referenced by a variable.
    // The output is:

    //     <?xml version="1.0" encoding="utf-8"?>
    //     <a>
    //         <b>BBB</b>
    //         <c>CCC</c>
    //     </a>

    // We can also see that "xml" contains an entirely new XML document:
    std.debug.print("{s}\n", .{try xml.getXml(alloc)});

    //     <?xml version="1.0" encoding="utf-8"?>
    //     <z>
    //         <x>XXX</x>
    //     </z>
    //
}