如何使用 R 访问和读取文件夹中的多个 XML 格式文件?
How can I access and read multiple XML format files within a folder using R?
我有一个本地文件夹,其中包含 64 个单独的 EVENTLOGSTATE 文件,这些文件采用 XML 格式,我正在尝试访问并读入 R。我能够访问该文件夹并列出所有该文件夹中的特定文件,但是当我尝试使用 library(XML) 中的 xmlParse 读取文件时,它给我一个错误,即 XML 内容似乎不是 XML.
作为参考,我创建了一个 list.file 行的示例、我的 xmlParse 行和返回的错误以及文件夹中的文件名示例以及每个文件中的数据。
list.files(path = "C:\Users\OneDrive\Documents\XML") #pulls list of file names within the XML folder
xmlParse(list.files(path = "C:\Users\OneDrive\Documents\XML"))
> xmlParse(list.files(path = "C:\Users\OneDrive\Documents\XML"))
Error: XML content does not seem to be XML: 'f5e450.eventLogState
EventLog-0e6f76b3-12bc-4d4a-aab6-a97600f5f46b.eventLogState
EventLog-11fbd569-4fd5-4bbe-89aa-a9df01378901.eventLogState
EventLog-151c1acc-0062-4f97-989a-a9d7015233f1.eventLogState
每个 EventLog 文件都包含有关记录的会话的数据,我需要这些数据才能提取记录的开始和结束时间,然后创建一个数据框以及对总长度和视觉效果的计算。但所有文件都是独立的,并包含以下格式的信息:
<?xml version="1.0" encoding="utf-8"?>
<EventLogState xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Panopto.Recorder">
<AttemptCount>5</AttemptCount>
<ErrorInfo>Unable to generate event logs</ErrorInfo>
<FileInfo i:nil="true" />
<PanoptoSiteFQDN>hosted.panopto.com</PanoptoSiteFQDN>
<RecordingEndTime>2018-10-11T12:13:38.1115286-04:00</RecordingEndTime>
<RecordingId>0e6f76b3-12bc-4d4a-aab6-a97600f5f46b</RecordingId>
<RecordingStartTime>2018-10-11T11:04:04.9321231-04:00</RecordingStartTime>
<SessionId>c3c84fee-836b-4d30-8115-a97600f85490</SessionId>
<Status>Error</Status>
</EventLogState>
我试过这个循环解决方案,但它只是 returns 一个 tibble 0 x 0
library(xml2)
library(dplyr)
files <- list.files(path = "C:\Users\OneDrive\Documents\XML")
dfs <-lapply(files, function(files) {
page <- read_xml(file)
id <- xml_find_first(out, "//EventLogState") %>% xml_attr("xmlns:i")
end.time <- xml_find_first(out, ".//RecordingEndTime") %>% xml_text()
start.time <- xml_find_first(out, ".//RecordingStartTime") %>% xml_text()
data.frame(id, end.time, start.time)
})
#combine all results into 1 data frame
answer <- bind_rows(dfs)
answer
关于如何让 xmlParse 行识别每个单独的文件并引入组合文本版本以供使用的任何想法?
这是一个好的开始。这些文件有一个与之关联的名称空间,这确实会引发曲线球。处理名称空间的最简单方法是将它们剥离。
另外,确保在 xml_find()
函数中引用了正确的文件。
这现在应该适合你了:
library(xml2)
library(dplyr)
files <- list.files(path = "C:\Users\OneDrive\Documents\XML")
dfs <-lapply(files, function(file) {
page <- read_xml(file)
# # Check for a namespeace
# xml_ns(page)
# # It is easier to work with the file if the namespace is removed
xml_ns_strip(page)
id <- xml_find_first(page, ".//RecordingId") %>% xml_text()
end.time <- xml_find_first(page, ".//RecordingEndTime") %>% xml_text()
start.time <- xml_find_first(page, ".//RecordingStartTime") %>% xml_text()
data.frame(id, end.time, start.time)
})
#combine all results into 1 data frame
answer <- bind_rows(dfs)
answer
以上代码假定每个文件只有一个“EventLogState”节点。
我有一个本地文件夹,其中包含 64 个单独的 EVENTLOGSTATE 文件,这些文件采用 XML 格式,我正在尝试访问并读入 R。我能够访问该文件夹并列出所有该文件夹中的特定文件,但是当我尝试使用 library(XML) 中的 xmlParse 读取文件时,它给我一个错误,即 XML 内容似乎不是 XML.
作为参考,我创建了一个 list.file 行的示例、我的 xmlParse 行和返回的错误以及文件夹中的文件名示例以及每个文件中的数据。
list.files(path = "C:\Users\OneDrive\Documents\XML") #pulls list of file names within the XML folder
xmlParse(list.files(path = "C:\Users\OneDrive\Documents\XML"))
> xmlParse(list.files(path = "C:\Users\OneDrive\Documents\XML"))
Error: XML content does not seem to be XML: 'f5e450.eventLogState
EventLog-0e6f76b3-12bc-4d4a-aab6-a97600f5f46b.eventLogState
EventLog-11fbd569-4fd5-4bbe-89aa-a9df01378901.eventLogState
EventLog-151c1acc-0062-4f97-989a-a9d7015233f1.eventLogState
每个 EventLog 文件都包含有关记录的会话的数据,我需要这些数据才能提取记录的开始和结束时间,然后创建一个数据框以及对总长度和视觉效果的计算。但所有文件都是独立的,并包含以下格式的信息:
<?xml version="1.0" encoding="utf-8"?>
<EventLogState xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Panopto.Recorder">
<AttemptCount>5</AttemptCount>
<ErrorInfo>Unable to generate event logs</ErrorInfo>
<FileInfo i:nil="true" />
<PanoptoSiteFQDN>hosted.panopto.com</PanoptoSiteFQDN>
<RecordingEndTime>2018-10-11T12:13:38.1115286-04:00</RecordingEndTime>
<RecordingId>0e6f76b3-12bc-4d4a-aab6-a97600f5f46b</RecordingId>
<RecordingStartTime>2018-10-11T11:04:04.9321231-04:00</RecordingStartTime>
<SessionId>c3c84fee-836b-4d30-8115-a97600f85490</SessionId>
<Status>Error</Status>
</EventLogState>
我试过这个循环解决方案,但它只是 returns 一个 tibble 0 x 0
library(xml2)
library(dplyr)
files <- list.files(path = "C:\Users\OneDrive\Documents\XML")
dfs <-lapply(files, function(files) {
page <- read_xml(file)
id <- xml_find_first(out, "//EventLogState") %>% xml_attr("xmlns:i")
end.time <- xml_find_first(out, ".//RecordingEndTime") %>% xml_text()
start.time <- xml_find_first(out, ".//RecordingStartTime") %>% xml_text()
data.frame(id, end.time, start.time)
})
#combine all results into 1 data frame
answer <- bind_rows(dfs)
answer
关于如何让 xmlParse 行识别每个单独的文件并引入组合文本版本以供使用的任何想法?
这是一个好的开始。这些文件有一个与之关联的名称空间,这确实会引发曲线球。处理名称空间的最简单方法是将它们剥离。
另外,确保在 xml_find()
函数中引用了正确的文件。
这现在应该适合你了:
library(xml2)
library(dplyr)
files <- list.files(path = "C:\Users\OneDrive\Documents\XML")
dfs <-lapply(files, function(file) {
page <- read_xml(file)
# # Check for a namespeace
# xml_ns(page)
# # It is easier to work with the file if the namespace is removed
xml_ns_strip(page)
id <- xml_find_first(page, ".//RecordingId") %>% xml_text()
end.time <- xml_find_first(page, ".//RecordingEndTime") %>% xml_text()
start.time <- xml_find_first(page, ".//RecordingStartTime") %>% xml_text()
data.frame(id, end.time, start.time)
})
#combine all results into 1 data frame
answer <- bind_rows(dfs)
answer
以上代码假定每个文件只有一个“EventLogState”节点。