diff --git a/README.md b/README.md index 9968fdc..8c7e5d6 100644 --- a/README.md +++ b/README.md @@ -99,20 +99,52 @@ node["key"] = value node["key"] ``` -- `Node` is an immutable type. However, you can easily create a copy with one or more field values changed by using the `Node(::Node; kw...)` constructor where `kw` are the fields you want to change. For example: +- `Node` is an immutable type. However, you can easily create a simple copy using `copy(::Node)` or +copy with one or more changes by using the `Node(::Node, atts...; kw...)` constructor where `atts` +are new children to add and `kw` are the node attributes you want to add or change. For example: ```julia -node = XML.Element("tag", XML.Text("child")) +julia> node = XML.Element("tag", XML.Text("child")) +Node Element (1 child) -simple_value(node) -# "child" +julia> simple_value(node) +"child" -node2 = Node(node, children=XML.Text("changed")) +julia> node2 = Node(node, new_att="I'm new") +Node Element (1 child) -simple_value(node2) -# "changed" +julia> node3 = Node(node2, XML.Element("new_child", child_att="I'm new too")) +Node Element (2 children) + +julia> println(XML.write(node)) +child + +julia> println(XML.write(node2)) +child + +julia> println(XML.write(node3)) + + child + + + +julia> node4=copy(node3) +Node Element (2 children) + +julia> println(XML.write(node4)) + + child + + + +julia> node4==node3 +true + +julia> node4===node3 +false ``` + ### Writing `Element` `Node`s with `XML.h` Similar to [Cobweb.jl](https://github.com/JuliaComputing/Cobweb.jl#-creating-nodes-with-cobwebh), `XML.h` enables you to write elements with a simpler syntax: diff --git a/src/XML.jl b/src/XML.jl index 9027ade..9baaaa5 100644 --- a/src/XML.jl +++ b/src/XML.jl @@ -269,6 +269,10 @@ simple_value(o) = is_simple(o) ? value(only(o)) : error("`XML.simple_value` is o Base.@deprecate_binding simplevalue simple_value +#-----------------------------------------------------------------------------# copy node + +Base.copy(o::AbstractXMLNode) = Node(o.nodetype, o.tag, o.attributes, o.value, isnothing(o.children) ? nothing : [Base.copy(x) for x in o.children]) + #-----------------------------------------------------------------------------# nodes_equal function nodes_equal(a, b) out = XML.tag(a) == XML.tag(b) diff --git a/test/runtests.jl b/test/runtests.jl index d41924b..e5f5f45 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -174,6 +174,16 @@ end end end +#-----------------------------------------------------------------------------# copy +@testset "Copy node" begin + for path in all_files + node = read(path, Node) + node2 = copy(node) + @test node == node2 + @test node2==deepcopy(node) + end +end + #-----------------------------------------------------------------------------# roundtrip @testset "read/write/read roundtrip" begin for path in all_files