在R中跳过读取for循环中的空文件

时间:2018-02-07 12:47:24

标签: r xml for-loop

我有大约100万个xml文件,我试图从中提取标记名和数据。以下是xml文件的示例。

   <?xml version="1.0" encoding="UTF-8"?>
    <IOTModellerLog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" DeviceID="7430180" ClientID="12324" FileCreationDate="2017-03-01T22:40:03" FileVersion="2" EventClassID="65535" IOTLogCreationDate="2017-03-01T12:29:54" SampleID="1" xsi:noNamespaceSchemaLocation="/opt/nds/ams_proxy/webapps/ams_proxy/WEB-INF/amsXmlSchema.xsd">
       <Event EventTime="2017-02-27T18:33:58">
          <IOTEvent State="PowerOn" />
       </Event>
       <Event EventTime="2017-02-28T08:59:03">
          <DataEvent>
             <Model>1</Model>
             <DataType>1</DataType>
             <DataValue>0301</DataValue>
          </DataEvent>
       </Event>
       <Event EventTime="2017-02-28T08:59:13">
          <DataEvent>
             <Model>1</Model>
             <DataType>1</DataType>
             <DataValue>0401</DataValue>
          </DataEvent>
       </Event>
    </IOTModellerLog>

我使用以下函数来解析xml数据。     库(XML)     库(data.table)

parse_xml <-function(FileName) {
  xmldata <- xmlParse(FileName)
  result_nodes = XML::getNodeSet(xmldata , "//IOTModellerLog/Event")
  abc <- rbindlist(lapply(result_nodes,function(x) data.frame(as.list(unlist(xmlToList(x))))),use.names = TRUE, fill = TRUE) 
  abc <- data.frame(lapply(abc, as.character), stringsAsFactors = FALSE)  
} 

我在for循环中使用此函数首先提取标记名称。

for (i in 1:length(files)) {
    dat <- parse_xml(files[i])
    namesdat = names(dat)
    output <- c(output,namesdat)
    output <- unique(output)    
}

但是,我收到的一些文件只包含与设备相关的元数据,而不是事件数据。例如:

<IOTModellerLog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" DeviceID="7430180" ClientID="12324" FileCreationDate="2017-03-01T22:40:03" FileVersion="2" EventClassID="65535" IOTLogCreationDate="2017-03-01T12:29:54" SampleID="1" xsi:noNamespaceSchemaLocation="/opt/nds/ams_proxy/webapps/ams_proxy/WEB-INF/amsXmlSchema.xsd">

</IOTModellerLog>

当for循环遇到这个文件时,它会停止并显示一条错误,表明它找不到列,这实际上意味着它无法找到数据。

我尝试在for循环中添加它

if (length(namesdat) == 0 ) next

类似地,我尝试在parse xml函数中添加if子句,仅当length(result_nodes)大于零时才允许。这也没有用。

有人可以帮忙吗?

0 个答案:

没有答案