一个特定于R的简单xml解析器

时间:2013-07-17 19:00:00

标签: xml regex r

我已经阅读过关于为什么永远不要在{HT,X} ML上使用正则表达式的问题,比如这个Regex to Indent an XML File,但我想我会发布一个我写的绝对的函数除了根据其从属级别缩进XML行之外什么都没有。

为了达到SO的指导方针,我会危险 - 我的解决方案:-),所以 -

当我开始使用此函数格式化某些未命名的坏人发送我的sans任何缩进的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))
}

1 个答案:

答案 0 :(得分:0)

还假设任何开口标记必须是一行中的第一件事。如果没有,则存在问题:

> cat(xmlit(c("<begin>","<foo/><begin>","</begin>","</begin>")), sep="\n")
<begin>
        <foo/><begin>
</begin>
/begin>

对于某些对XML(其他)结构有足够假设的XML子集,正则表达式可以正常工作。但是如果这些假设被违反了,那就是解析器的原因。