R - 获取 XML 节点

Posted

技术标签:

【中文标题】R - 获取 XML 节点【英文标题】:R - Get XML nodes 【发布时间】:2020-10-23 04:53:17 【问题描述】:

我有一个关于 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,它仍然返回正确的结果

你能解释一下问题是什么吗?谢谢。

我在here附上了excel文件、输出zip文件和XML文件

【问题讨论】:

【参考方案1】:

您的文档在根“工作表”节点中具有默认命名空间。 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")

【讨论】:

以上是关于R - 获取 XML 节点的主要内容,如果未能解决你的问题,请参考以下文章

如何从 XML 文件中按编号获取子节点

XPath 表达式有条件地获取相邻节点

处理 R 中的空 XML 节点

怎样获取xml中当前节点的直接孩子节点个数

使用 R 的 xmlEventParse 存储特定的 XML 节点值

将具有重复节点的 XML 转换为 R 数据框