1#' The (tag) name of an xml element.
2#'
3#' @param x A document, node, or node set.
4#' @param ns Optionally, a named vector giving prefix-url pairs, as produced
5#'   by [xml_ns()]. If provided, all names will be explicitly
6#'   qualified with the ns prefix, i.e. if the element `bar` is defined
7#'   in namespace `foo`, it will be called `foo:bar`. (And
8#'   similarly for attributes). Default namespaces must be given an explicit
9#'   name. The ns is ignored when using [xml_name<-()] and
10#'   [xml_set_name()].
11#' @return A character vector.
12#' @export
13#' @examples
14#' x <- read_xml("<bar>123</bar>")
15#' xml_name(x)
16#'
17#' y <- read_xml("<bar><baz>1</baz>abc<foo /></bar>")
18#' z <- xml_children(y)
19#' xml_name(xml_children(y))
20xml_name <- function(x, ns = character()) {
21  UseMethod("xml_name")
22}
23
24#' @export
25xml_name.xml_missing <- function(x, ns = character()) {
26  NA_character_
27}
28
29#' @export
30xml_name.xml_nodeset <- function(x, ns = character()) {
31  vapply(x, xml_name, ns = ns, FUN.VALUE = character(1))
32}
33
34#' @export
35xml_name.xml_node <- function(x, ns = character()) {
36  .Call(node_name, x$node, ns)
37}
38
39#' Modify the (tag) name of an element
40#'
41#' @param value a character vector with replacement name.
42#' @rdname xml_name
43#' @export
44`xml_name<-` <- function(x, ns = character(), value) {
45   UseMethod("xml_name<-")
46}
47
48#' @export
49`xml_name<-.xml_node` <- function(x, ns = character(), value) {
50  .Call(node_set_name, x$node, value)
51  x
52}
53
54#' @export
55`xml_name<-.xml_nodeset` <- function(x, ns = character(), value) {
56  if (length(x) == 0) {
57    return(x)
58  }
59  if (!is.list(ns)) {
60     ns <- list(ns)
61  }
62  Map(`xml_name<-`, x, ns, value)
63  x
64}
65
66#' @export
67`xml_name<-.xml_missing` <- function(x, ns = character(), value) {
68  x
69}
70
71set_name <- function(x, value, ns = character()) {
72  xml_name(x = x, ns = ns) <- value
73  x
74}
75
76#' @rdname xml_name
77#' @export
78xml_set_name <- function(x, value, ns = character()) {
79  UseMethod("xml_set_name")
80}
81
82#' @export
83xml_set_name.xml_node <- set_name
84
85#' @export
86xml_set_name.xml_nodeset <- set_name
87
88#' @export
89xml_set_name.xml_missing <- set_name
90