xmllint - 无法读取特殊字符

时间:2016-01-05 19:50:03

标签: xml linux bash xpath xmllint

在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

上面的命令什么都不返回。所有我正在做的是改变关键名称,现在它不会工作。有人可以帮忙吗?

1 个答案:

答案 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)。