我有一個本地檔案夾,其中包含 64 個 XML 格式的單獨 EVENTLOGSTATE 檔案,我試圖訪問這些檔案并將其讀入 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>
我試過這個回圈解決方案,但它只回傳一個 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 行識別每個單獨的檔案并提取組合文本版本以使用的任何想法?
uj5u.com熱心網友回復:
那是一個好的開始。這些檔案有一個與之關聯的命名空間,它確實拋出了一個曲線球。處理命名空間的最簡單方法是將它們剝離。
此外,請確保在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”節點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/379718.html
