2013-07-17 55 views
0

我已經閱讀了關於爲什麼從未在{HT,X} ML上使用正則表達式的SO問題,比如這個 - Regex to Indent an XML File,但我想我會發佈一個我寫的函數除了根據它們的從屬級別縮進XML行外絕對沒有什麼。一個簡單的xml解析器特定於R

爲了滿足這樣的準則,我會危害 - IZE我的解決方案:-),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)) 
} 

回答

0

還有一個假設,任何開標籤必須是一行上的第一個東西。如果不是,有問題:

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

對於有關(附加)結構不夠假設XML的一些子集,正則表達式可以正常工作。但是如果這些假設被違反了,那麼這就是爲什麼有解析器。

+0

是的,這是我得到的印象。我會將我的代碼保留在本地,以便在特定項目中使用xml的特殊風格。 –