Today we are pleased to release version 1.1.1 of xml2. xml2 makes it easy to read, create, and modify XML with R. You can install it with:


As well as fixing many bugs, this release:

You can see a full list of changes in the release notes. This is the first release maintained by Jim Hester.

Creating and modifying XML

xml2 has been overhauled with a set of methods to make generating and modfying XML easier:

xml_new_root("x") %>%
  xml_add_child("y") %>%
#> {xml_document}
#> <x>
#> [1] <y/>
x <- read_xml("<a>
    <b />
#> {xml_document}
#> <a>
#> [1] <b/>
#> [2] <c>\n  <b/>\n</c>

x %>%
  xml_find_all(".//b") %>%
  xml_set_name("banana") %>%
  xml_set_attr("oldname", "b")
#> {xml_document}
#> <a>
#> [1] <banana oldname="b"/>
#> [2] <c>\n  <banana oldname="b"/>\n</c>

Coercion to and from R Lists

xml2 1.1.1 improves support for converting to and from R lists, thanks in part to work by Peter Foley and Jenny Bryan. In particular xml2 now supports preserving the root node name as well as saving all xml2 attributes as R attributes. These changes allows you to convert most XML documents to and from R lists with as_list() and as_xml_document() without loss of data.

x <- read_xml("<fruits><apple color = 'red' /></fruits>")
#> {xml_document}
#> <fruits>
#> [1] <apple color="red"/>
#> $apple
#> list()
#> attr(,"color")
#> [1] "red"
#> {xml_document}
#> <apple color="red">

XML validation and xslt

xml2 1.1.1 also adds support for XML validation, thanks to Jeroen Ooms. Simply read the document and schema files and call xml_validate().

doc <- read_xml(system.file("extdata/order-doc.xml", package = "xml2"))
schema <- read_xml(system.file("extdata/order-schema.xml", package = "xml2"))
xml_validate(doc, schema)
#> [1] TRUE
#> attr(,"errors")
#> character(0)

Jeroen also released the first xml2 extension package in conjunction with xml2 1.1.1, xslt. xslt allows one to apply XSLT (Extensible Stylesheet Language Transformations) to XML documents, which are great for transforming XML data into other formats such as HTML.