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

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

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

[我不希望使用XML程序包,因为它显然是孤立的。

r libxml2 xml2
2个回答
1
投票

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

xml2::read_xml(charToRaw(lit))

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


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"))
© www.soinside.com 2019 - 2024. All rights reserved.