将原始数据转换为 XML 字符串并在 R 中解析它

问题描述 投票:0回答:1

我使用

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-parsing
1个回答
0
投票

由于

R
没有 XML 的内置类型,因此它必须依赖于文本(或 R 理解的任何其他形式)表示。

不幸的是,您没有向我们展示您如何检索

binary_data
,但我猜您首先尝试将 XML 转换为二进制?

无论如何,这种方法的效果符合预期:

SQL 服务器

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);

R

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 中不存在数据类型的问题。

© www.soinside.com 2019 - 2024. All rights reserved.