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

时间:2019-11-18 15:41:14

标签: r libxml2 xml2

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

我不希望使用XML软件包,因为它显然是孤立的。

2 个答案:

答案 0 :(得分:2)

查看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"))

答案 1 :(得分:1)

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

xml2::read_xml(charToRaw(lit))

因为这是read_xml在内部对文字XML字符串所做的工作。但是,缺少标签read_xml将会总是失败,因为它期望至少有一个周围的标签。但这至少可以防止read_xml意外打开文件。