Xml in Julia

Here’s the translation of the XML example from Go to Julia, formatted in Markdown suitable for Hugo:

Julia provides built-in support for XML and XML-like formats with the EzXML package. Let’s explore how to work with XML in Julia.

First, we need to install and import the EzXML package:

using Pkg
Pkg.add("EzXML")
using EzXML

Now, let’s define a struct that will be mapped to XML:

struct Plant
    id::Int
    name::String
    origin::Vector{String}
end

function Base.show(io::IO, p::Plant)
    print(io, "Plant id=$(p.id), name=$(p.name), origin=$(p.origin)")
end

In this example, we’re using a simple struct. Julia doesn’t have built-in XML tags like Go, so we’ll handle the XML conversion manually.

Now let’s create a plant and convert it to XML:

coffee = Plant(27, "Coffee", ["Ethiopia", "Brazil"])

# Function to convert Plant to XML string
function plant_to_xml(p::Plant)
    return """
    <plant id="$(p.id)">
      <name>$(p.name)</name>
      $(join(map(o -> "  <origin>$o</origin>", p.origin), "\n"))
    </plant>
    """
end

# Convert to XML and print
xml_string = plant_to_xml(coffee)
println(xml_string)

# Add XML header
println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n", xml_string)

To parse XML back into a Julia struct:

function xml_to_plant(xml_string::String)
    doc = parsexml(xml_string)
    root = root(doc)
    id = parse(Int, attribute(root, "id"))
    name = nodecontent(findfirst("//name", root))
    origin = [nodecontent(o) for o in findall("//origin", root)]
    return Plant(id, name, origin)
end

p = xml_to_plant(xml_string)
println(p)

Now, let’s create another plant and demonstrate nesting:

tomato = Plant(81, "Tomato", ["Mexico", "California"])

# Function to create nested XML
function create_nested_xml(plants::Vector{Plant})
    plant_xmls = join(map(plant_to_xml, plants), "\n")
    return """
    <nesting>
      <parent>
        <child>
          $plant_xmls
        </child>
      </parent>
    </nesting>
    """
end

nested_xml = create_nested_xml([coffee, tomato])
println(nested_xml)

This example demonstrates how to work with XML in Julia, including creating XML from structs, parsing XML into structs, and creating nested XML structures. While Julia doesn’t have the same built-in XML struct tags as Go, we can achieve similar functionality by defining our own conversion functions.