我已经阅读了关于为什么永远不要在 {HT,X}ML 上使用正则表达式的 SO 问题,例如这个 - Regex to Indent an XML File,但我想我会发布一个我写的函数,它除了根据从属级别缩进 XML 行。
为了符合 SO 的指导方针,我会冒险 - 调整我的解决方案 :-) ,所以 -
当我开始使用这个函数来格式化一些不知名的坏人发送给我的没有任何缩进的 XML 文件时,会出现什么问题?
xmlit <- function(x,indchar = '\t'){
# require x to be a vector of char strings, one
# per line of the XML file.
# Add an indent for every line below one starting "<[!/]" and
# remove an indent for every line below "</"
indit <-''
y<-vector('character',length(x))
for(j in 1:length(x) ) {
# first add whatever indent we're up to
y[j] <- paste(indit,x[j],collapse='',sep='')
# check for openers: '<' but not '</' or '/>'
if( grepl('<[^/?!]' ,x[j]) & !grepl('/>', x[j]) & !grepl('</',x[j]) ) {
indit<-paste(indit,indchar,collapse='',sep='')
} else {
# check for closers: '</'
if( grepl('<[/]' ,x[j]) & !grepl('<[^/?!]',x[j]) ) {
# move existing line back out one indent
y[j]<- substr(y[j],2,1000)
indit<-substr(indit,2,1000)
}
}
}
# Note that I'm depending on every level to have a matching closer,
# and that in particular the very last line is a closer.
return(invisible(y))
}