簡體   English   中英

R - 獲取 XML 節點

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM