Как заменить код в <head>разделах всех документов HTML в каталоге, используя R - PullRequest
0 голосов
/ 03 сентября 2018

Я ищу эффективный способ изменить код между тегами <head> </head> для большого количества HTML-документов, которые все хранятся в одной папке.

R является обязательным условием, так как это часть проекта класса rmarkdown, и я хотел бы, чтобы код был понятен студентам.

Для моей цели было бы достаточно перезаписать каждый заголовок документа одинаковыми строками, которые, например, настраивают CSS или связывают файлы .js.

Я пытался сделать это в R, используя такие функции, как readLines() и writeLines() в сочетании с регулярными выражениями, но это кажется слишком громоздким. Я хотел бы иметь более элегантное и конкретное решение, которое использует DOM.

1 Ответ

0 голосов
/ 03 сентября 2018

Я только что понял, что вы хотите заменить все дочерние узлы. Вот код для достижения этого. Сценарий использует lapply для открытия каждого файла, анализа XML-кода, удаления всех дочерних узлов head и добавления к нему элемента script с аргументом src.

Заменить все дочерние узлы

library(XML)

files <- list.files(full.names = T, pattern = "*.html")

lapply(files, function(f) {
  content  <- xmlInternalTreeParse(f, isHTML = T)
  # get head node
  headNode <- getNodeSet(content, path = "//head")
  # remove all child nodes
  do.call(removeChildren, args = list(kids = names(xmlChildren(headNode[[1]])), node = headNode[[1]]))
  # create new nodes
  newNode  <- newXMLNode("script", attrs = list(src = "myScript.js"))
  # add new nodes
  addChildren(headNode[[1]], newNode)
  saveXML(doc = content, file = f)
})

Добавить новый узел

library(XML)

files <- list.files(full.names = T, pattern = "*.html")

lapply(files, function(f) {
  content  <- xmlInternalTreeParse(f, isHTML = T)
  headNode <- getNodeSet(content, path = "//head")
  newNode  <- newXMLNode("script", attrs = list(src = "myScript.js"))

  addChildren(headNode[[1]], newNode)
  saveXML(doc = content, file = f)
})
...