在bash shell提示符下,我想运行xmllint从xml文件中获取数据。让我们看一下我没有问题的文件:
看看fruits.xml文件:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="mykey">grapes</string>
</map>
这就是我使用xmllint获取价值&#34; grape&#34;来自fruits.xml
xmllint --xpath "string(/map/string[@name = 'mykey'])" fruits.xml
我得到以下输出:
$ grapes
很棒,我得到了价值,但这不是我需要使用的实际密钥。 &#34;的myKey&#34;应该是&#34; c1:fruits_id-%1 $ s&#34;
现在当我改变&#34; mykey&#34; fruits.xml文件中的值为另一个值,我无法从xmllint获取任何返回值:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="c1:fruits_id-%1$s">grapes</string>
</map>
xmllint --xpath "string(/map/string[@name = 'c1:fruits_id-%1$s'])" fruits.xml
上面的命令什么都不返回。所有我正在做的是改变关键名称,现在它不会工作。有人可以帮忙吗?
答案 0 :(得分:1)
(您显示的XML文档在属性值前面没有parse_string <- function(string, object_name) {
st <- string
t1 <- gsub("([a-z])", paste0(object_name, "\\$\\U\\1==0"), st, perl = TRUE)
t2 <- gsub("((?<!\\$)[A-Z])", paste0(object_name, "\\$\\U\\1==1"), t1, perl = TRUE)
t3 <- gsub(paste0("([0-9])(", object_name, ")"), "\\1 & \\2", t2)
t4 <- gsub(" ?\\+ ?", ") | (", t3)
t5 <- paste("(", t4, ")", sep = "")
return(t5)
}
> parse_string(st, "tt") == t5
# [1] TRUE
> parse_string(st, "foo")
# [1] "(foo$A==1 & foo$B==0 & foo$C==1) | (foo$D==0 & foo$E==0) | (foo$F==1 & foo$G==1 & foo$H==1 & foo$I==1 & foo$J==1)"
> parse_string("AbC+de+FGHIJ", "tt") == t5
# [1] TRUE
- 我猜错了?)
如果在shell命令中使用c1:
,它将被解释为变量,并且变量插值会启动。因为变量不存在,所以它将被替换为空。您可以通过将XML文档更改为
$
唯一的变化是删除了两个字符<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="c1:fruits_id-%1">grapes</string>
</map>
。现在路径表达式找到字符串:
$s
将角色转移为$ xmllint --xpath "string(/map/string[@name = 'c1:fruits_id-%1$s'])" fruit.xml
grapes
,就像Biffen已经建议的那样:
\$
或同样容易交换引号:
$ xmllint --xpath "string(/map/string[@name = 'c1:fruits_id-%1\$s'])" fruit.xml
grapes
对于由单引号分隔的字符串,没有变量插值,即使其中有双引号(请参阅this question)。