我有大约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)
大于零时才允许。这也没有用。
有人可以帮忙吗?