强制 read_xml 将字符串解释为文字 XML

Force read_xml to interpret string as literal XML

我一直在努力强制 read_xml 函数(xml2 包)将我的字符输入视为文字字符串。显然,如果输入看起来不像 XML,它会尝试将其作为 url 以及本地文件名打开。这把我吓坏了,即使它不是一个明显的安全漏洞(但我绝对可以看到它存在的情况)。所以,简而言之,我如何强制函数将我的输入解释为文字 xml 文本,并禁用 url/filename 查找的可能性?

我不想使用 XML 包,因为它显然是孤立的。

查看 xml2:::read_xml.character 的来源,如果数据包含任何 <> 符号,它将把数据视为原始输入。然后它将值传递给 read_xml.raw。您可以编写自己的包装器以确保始终发生这种情况。

read_xml_literal <- function(x, ..., as_html=FALSE, options = "NOBLANKS") {
    if (length(x) == 0) {
        stop("Document is empty", call. = FALSE)
    }
    options <- xml2:::parse_options(options, xml2:::xml_parse_options())
    if (grepl("<|>", x)) {
        xml2:::read_xml.raw(charToRaw(enc2utf8(x)), "UTF-8", ..., 
            as_html = as_html, options = options)
    } else {
        stop("Input does not '<' or '>'")
    }
}

所以这行得通

read_xml_literal("<foo><bar /></foo>")

位这不

read_xml_literal(xml2_example("cd_catalog.xml"))

一种方法是将您的文字文本显式强制转换为 raw 值并调用 read_xml

xml2::read_xml(charToRaw(lit))

因为这就是 read_xml 在内部对文字 XML 字符串所做的事情。然而,缺少任何标签 read_xml 总是 失败,因为它需要至少一个周围的标签。但至少这可以防止 read_xml 意外打开文件。