## myxmlNode <- ## function(name, ..., attrs=NULL, namespace="") ## { ## kids <- lapply(list(...), asXMLNode) ## names(kids) <- sapply(kids,xmlName) ## node <- list(name = name, attributes = attrs, children = kids, namespace=namespace) ## class(node) <- c("XMLNode") ## node ## } ## #"[<-.XMLNode" ## "myassign1.XMLNode" <- ## function(x,i,value) ## { ## x$children[i] <- value ## names(x$children) <- sapply(x$children,xmlName) ## x ## } ## #"[[<-.XMLNode" ## "myassign2.XMLNode" <- ## function(x,i,value) ## { ## x$children[[i]] <- value ## names(x$children) <- sapply(x$children,xmlName) ## x ## } ## myappend.XMLNode <- ## function(to, ...) ## { ## args <- list(...) ## if(!inherits(args[[1]], "XMLNode") && is.list(args[[1]])) ## args <- args[[1]] ## idx <- seq(length(to$children) + 1, length=length(args)) ## if(is.null(to$children)) ## to$children <- args ## else { ## to$children[idx] <- args ## # names(to$children)[idx] <- names(args) ## } ## names(to$children) <- sapply(to$children,xmlName) ## to ## } "xmlAddChild" <- function(node, child) { node$children <- append(node$children,list(child)) names(node$children) <- sapply(node$children,xmlName) node } ## "xmlChildren<-" <- ## function(x,value) { ## names(value) <- sapply(value,xmlName) ## x$children <- value ## x ## } ## ## Bug fix for problems with empty nodes. ## "myprint.XMLNode" <- ## function (x, ..., indent = "", tagSeparator = "\n") ## { ## if (!is.null(xmlAttrs(x))) { ## tmp <- paste(names(xmlAttrs(x)), paste("\"", xmlAttrs(x), ## "\"", sep = ""), sep = "=", collapse = " ") ## } ## else tmp <- "" ## if (!is.null(x$namespaceDefinitions)) { ## ns <- paste(sapply(x$namespaceDefinitions, function(x) { ## paste("xmlns", ifelse(nchar(x$id) > 0, ":", ""), ## x$id, "=", "\"", x$uri, "\"", sep = "") ## }), collapse = " ") ## } ## else ns <- "" ## subIndent <- paste(indent, " ", sep = "") ## if (is.logical(indent) && !indent) { ## indent <- "" ## subIndent <- FALSE ## } ## if (length(xmlChildren(x)) == 0) { ## ## Empty Node ## cat(indent, paste("<", xmlName(x, TRUE), ifelse(tmp != "", ## " ", ""), tmp, ifelse(ns != "", " ", ""), ns, "/>", tagSeparator, ## sep = ""), sep = "") ## } else if (length(xmlChildren(x))==1 && ## is(xmlChildren(x)[[1]],"XMLTextNode")) { ## ## Sole child is text node, print without extra white space. ## cat(indent, paste("<", xmlName(x, TRUE), ifelse(tmp != "", ## " ", ""), tmp, ifelse(ns != "", " ", ""), ns, ">", ## sep = ""), sep = "") ## cat(xmlValue(xmlChildren(x)[[1]]),sep="") ## cat(paste("", tagSeparator, ## sep = ""), sep = "") ## } else { ## cat(indent, paste("<", xmlName(x, TRUE), ifelse(tmp != "", ## " ", ""), tmp, ifelse(ns != "", " ", ""), ns, ">", tagSeparator, ## sep = ""), sep = "") ## for (i in xmlChildren(x)) ## print(i, indent = subIndent, tagSeparator = tagSeparator) ## cat(indent, paste("", tagSeparator, ## sep = ""), sep = "") ## } ## } ## assignInNamespace("xmlNode",myxmlNode,"XML") ## assignInNamespace("[<-.XMLNode",myassign1.XMLNode,"XML") ## assignInNamespace("[[<-.XMLNode",myassign2.XMLNode,"XML") ## assignInNamespace("append.XMLNode",myappend.XMLNode,"XML") ## assignInNamespace("print.XMLNode",myprint.XMLNode,"XML") ## assign("xmlChildren<-",xmlSetChildren) ## .First.lib <- function(libname,pkgname) { ## ## Alternative code for working with earlier version of XML (0.95) ## unlockBinding("xmlNode",as.environment(match("package:XML",search()))) ## assign("xmlNode",myxmlNode,match("package:XML",search())) ## ##unlockBinding("[.XMLNode",as.environment(match("package:XML",search()))) ## ##assign("[<-.XMLNode",myassign1.XMLNode,match("package:XML",search())) ## assignInNamespace("[<-.XMLNode",myassign1.XMLNode,"XML") ## ##unlockBinding("[[<-.XMLNode",as.environment(match("package:XML",search()))) ## ##assign("[[<-.XMLNode",myassign2.XMLNode,match("package:XML",search())) ## assignInNamespace("[[<-.XMLNode",myassign2.XMLNode,"XML") ## unlockBinding("append.XMLNode",as.environment(match("package:XML",search()))) ## assign("append.XMLNode",myappend.XMLNode,match("package:XML",search())) ## assignInNamespace("append.XMLNode",myappend.XMLNode,"XML") ## ##unlockBinding("print.XMLNode",as.environment(match("package:XML",search()))) ## ##assign("print.XMLNode",myprint.XMLNode,match("package:XML",search())) ## assignInNamespace("print.XMLNode",myprint.XMLNode,"XML") ## #unlockBinding("xmlNode",as.environment(match("package:XML",search()))) ## #assign("xmlChildren<-",xmlSetChildren,match("package:XML",search())) ## ## Can't add this to XML package because that package is locked (with ## ## no way to unlock it). ## #assignInNamespace("xmlChildren<-",xmlSetChildren),"XML") ## }