我使用
odbc
包将一些数据从 SQL Server 数据库引入 R,其中包含一个需要转换为 XML 字符串然后进行解析的原始字段(即每个记录中都有一个单独的 XML)。早些时候,我将其转换为 SQL 本身中的字符串 -
SELECT
CONVERT(VARCHAR(MAX), xml_content) AS xml_string
FROM ....
然后使用
xml_string
包解析 R 中的 xml2
-
xml_list <- as_list(
read_xml(xml_string,
options = c("HUGE")
)
)
但这会增加查询的大量处理时间,因为它会引入数千条记录,而且 XML 字符串很大。我想在 R 本身中执行转换和解析,以减少查询处理时间。我无法找到正确的函数来执行转换,因为我尝试的任何操作都只返回 XML 字符串的片段,而不是整个字符串。我试过了-
#Method 1 -
raw_data <- readBin(binary_data, what = "raw", n=length(binary_data))
rawToChar(raw_data)
#Method 2 -
iconv(rawToChar(as.raw(binary_data)), from = "UTF-8", to = "UTF-8")
#Method 3 -
decoded_data <- base64decode(binary_data)
xml_string <- rawToChar(decoded_data)
但它们似乎没有为我生成整个 XML 字符串。我是 R 菜鸟,所以想要一些关于我哪里出错以及如何补救的建议。谢谢!
由于
R
没有 XML 的内置类型,因此它必须依赖于文本(或 R 理解的任何其他形式)表示。
不幸的是,您没有向我们展示您如何检索
binary_data
,但我猜您首先尝试将 XML 转换为二进制?
无论如何,这种方法的效果符合预期:
DROP TABLE IF EXISTS ##funwithxml;
CREATE TABLE ##funwithxml (
x XML
);
DECLARE @xml XML = '<employee>
<firstname type="textbox">Jimmy</firstname>
<lastname type="textbox">Bischoff</lastname>
<email type="textbox">[email protected]</email>
<title type="textbox">Database Engineer</title>
</employee>';
INSERT INTO ##funwithxml VALUES(@xml);
library(dplyr)
library(dbplyr)
con <- DBI::dbConnect(odbc::odbc(), "<myserver>")
con %>%
tbl("##funwithxml") %>%
mutate(x = sql("CAST(x AS NVARCHAR(MAX))")) %>% ## do explicit convert
pull(x) %>%
xml2::read_xml()
# {xml_document}
# <employee>
# [1] <firstname type="textbox">Jimmy</firstname>
# [2] <lastname type="textbox">Bischoff</lastname>
# [3] <email type="textbox">[email protected]</email>
# [4] <title type="textbox">Database Engineer</title>
当然,从概念上讲,您仍然在 SQL Server 端进行转换,但在我看来,这是唯一的方法,因为 R 中没有
XML
数据类型。您也可以转换为 VARBINARY
并将其转换为一个字符串,然后将其传递给 read_xml
,但是您需要某种(SQL-)服务器端转换来克服 R 中不存在数据类型的问题。