[英]R - Get XML nodes
我有一個關於 XML 節點的問題。
我想替換 Excel 文件中的值和公式,所以首先,我使用file.rename()
將其更改為 zip 文件,之后,我在 zip 文件的 XML 文件中工作。 您可以在/xl/worksheets/sheet1.xml
找到 XML 來替換,我編寫代碼行:
library(XML)
### Change excel to zip
data_path <- "Untitled 1.xlsx"
file.rename(data_path, "Untitled 1.zip")
dir.create("Untitled 1")
utils::unzip("Untitled 1.zip", exdir = "Untitled 1")
### Read XML file
doc <- xmlTreeParse("Untitled 1/xl/worksheets/sheet1.xml", useInternal = TRUE)
#### Select the nodes we want to update
nodes <- getNodeSet(doc, "/worksheet")
nodes <- getNodeSet(doc, "/worksheet/sheetData")
# > list()
# > list()
當我得到節點時,它們都返回空白列表節點。 它與getNodeSet(doc, "/")
,Xpath 表達式為/
,它返回長度為 1 的列表。我不明白為什么會這樣? XML 文件有什么問題? 我剛剛在https://www.freeformatter.com/xpath-tester.html 中進行了測試,如果 Xpath 表達式是/worksheet
或/worksheet/sheetData
,它仍然返回正確的結果
你能解釋一下問題是什么嗎? 謝謝你。
我在這里附上了 excel 文件、輸出 zip 文件和 XML 文件
您的文檔在根“工作表”節點中具有默認命名空間。 XML
庫需要命名默認命名空間。 你可以做這樣的事情
# name the namespaces
ns <- c(ns="http://schemas.openxmlformats.org/spreadsheetml/2006/main",
r="http://schemas.openxmlformats.org/officeDocument/2006/relationships")
# use the ns= namespace in the xpath
getNodeSet(doc, "/ns:worksheet", namespaces = ns)
getNodeSet(doc, "/ns:worksheet/ns:sheetData", namespaces = ns)
我知道使用xml2
,如果您不想打擾它,可以刪除默認名稱空間。 你可以做
library(xml2)
doc <- xml_ns_strip(read_xml("sheet1.xml"))
xml_find_all(doc, "/worksheet")
xml_find_all(doc, "/worksheet/sheetData")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.