R - 获取 XML 个节点
R - Get XML nodes
我有一个关于 XML 个节点的问题。
我想替换 Excel 文件中的值和公式,所以首先,我使用 file.rename()
将其更改为 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()
当我获取节点时,所有节点都是return 空白列表节点。它与 getNodeSet(doc, "/")
一起工作,Xpath 表达式是 /
,它 return 列表的长度 = 1。我不明白为什么会这样? XML 文件有什么问题?我刚刚在 https://www.freeformatter.com/xpath-tester.html 中测试过,如果 Xpath 表达式是 /worksheet
或 /worksheet/sheetData
,它仍然是 return 正确的结果
你能解释一下问题是什么吗?谢谢。
我在 here
中附加了 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")
我有一个关于 XML 个节点的问题。
我想替换 Excel 文件中的值和公式,所以首先,我使用 file.rename()
将其更改为 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()
当我获取节点时,所有节点都是return 空白列表节点。它与 getNodeSet(doc, "/")
一起工作,Xpath 表达式是 /
,它 return 列表的长度 = 1。我不明白为什么会这样? XML 文件有什么问题?我刚刚在 https://www.freeformatter.com/xpath-tester.html 中测试过,如果 Xpath 表达式是 /worksheet
或 /worksheet/sheetData
你能解释一下问题是什么吗?谢谢。
我在 here
中附加了 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")