\name{getSibling} \alias{getSibling} \alias{addSibling} \title{Manipulate sibling XML nodes} \description{ These functions allow us to both access the sibling node to the left or right of a given node and so walk the chain of siblings, and also to insert a new sibling } \usage{ getSibling(node, after = TRUE, ...) addSibling(node, ..., kids = list(...), after = NA) } \arguments{ \item{node}{the internal XML node (XMLInternalNode) whose siblings are of interest} \item{\dots}{the XML nodes to add as siblings or children to node.} \item{kids}{a list containing the XML nodes to add as siblings. This is equivalent to ... but used when we already have the nodes in a list rather than as individual objects. This is used in programmatic calls to \code{addSibling} rather interactive use where we more commonly have the individual node objects. } \item{after}{a logical value indicating whether to retrieve or add the nodes to the right (\code{TRUE}) or to the left (\code{FALSE}) of this sibling. } } \value{ \code{getSibling} returns an object of class XMLInternalNode (or some derived S3 class, e.g. XMLInternalTextNode) \code{addSibling} returns a list whose elements are the newly added XML (internal) nodes. } \seealso{ \code{\link{xmlChildren}}, \code{\link{addChildren}} \code{\link{removeNodes}} \code{\link{replaceNodes}} } \examples{ # Reading Apple's iTunes files # # Here we read a "censored" "database" of songs from Apple's iTune application # which is stored in a property list. The format is quite generic and # the fields for each song are given in the form # # ArtistPerson's name # # So to find the names of the artists for all the songs, we want to # find all the Artist nodes and then get their next sibling # which has the actual value. # # More information can be found in . # fileName = system.file("exampleData", "iTunes.plist", package = "XML") doc = xmlParse(fileName) nodes = getNodeSet(doc, "//key[text() = 'Artist']") sapply(nodes, function(x) xmlValue(getSibling(x))) f = system.file("exampleData", "simple.xml", package = "XML") tt = as(xmlParse(f), "XMLHashTree") tt e = getSibling(xmlRoot(tt)[[1]]) # and back to the first one again by going backwards along the sibling list. getSibling(e, after = FALSE) # This also works for multiple top-level "root" nodes f = system.file("exampleData", "job.xml", package = "XML") tt = as(xmlParse(f), "XMLHashTree") x = xmlRoot(tt, skip = FALSE) getSibling(x) getSibling(getSibling(x), after = FALSE) } \keyword{IO}