在xml文件bash脚本中搜索值

时间:2016-01-13 12:31:49

标签: xml bash parsing find

我有xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>group</groupId>
<artifactId>project100</artifactId>
<versioning>
  <latest>1.2.1-black</latest>
  <release>1.2.1-black</release>
 <versions>
   <version>1.0.0</version>
   <version>1.0.0-black</version>
   <version>1.0.2</version>
   <version>1.0.1</version>
   <version>1.2.0</version>
   <version>1.2.1-black</version>
  </versions>
 </versionsing>
</metadata>

我还有一个变量,如:$ ID = 1.0.2,我想检查我的xml文件中是否存在此ID。 我尝试这样的事情:

'cat ///metadata/versioning/version/text()' | xmllint --shell $content | grep -v "^/ >"

其中$ contenet是我的xml文件,但是这显示了像这样的mi:

warning: failed to load external entity "<version>1.0.0</version>

来自xml文件的每个实体。我不知道该怎么做。我在bash脚本编写方面有点无聊

2 个答案:

答案 0 :(得分:1)

我认为$content包含文件的内容,而您使用的工具则需要传递文件的名称。它将XML的每个“单词”(如<version>1.0.0</version>)视为文件的路径而无法找到,所以抱怨。

我还注意到你正在使用--shell,然后必须使用grep来删除提示。您可以直接使用--xpath来避免这种情况。

我建议尝试这样的事情:

echo "$content" | xmllint --xpath '//metadata/versioning/versions/version/text()' -

或者如果你有要处理的文件的名称,那么就这样做:

xmllint --xpath '//metadata/versioning/versions/version/text()' file.xml

我认为versionsing是一个拼写错误,因此我在XPath中将其更改为versioning。我还添加了缺失的部分versions/(感谢choroba)。

鉴于您尝试过滤到特定版本,我猜你想要这样的东西:

$ id=1.0.0
$ xmllint --xpath "//metadata/versionsing/versions/version[text() = '$id']/text()" file.xml
1.0.0

要确定某个特定版本是否存在,您可以这样做:

id=1.2.3
xpath="//metadata/versionsing/versions/version[text() = '$id']"
if xmllint --xpath "$xpath" file.xml 2>/dev/null
then
    echo "version $id found"
else
    echo "version $id not found"
fi

答案 1 :(得分:0)

这将告诉您XML文件中是否存在ID值:

Object

修改 不包括部分匹配:

public Cartao parseJSON(String jsonParam){

    Cartao jsonCartao = new Cartao();

    try {
        JSONObject json = (JSONObject) new JSONTokener(jsonParam).nextValue();
        jsonCartao = new Cartao(
            json.getString("NomeCartao"), 
            json.getDouble("SaldoRestante"), 
            json.getString("NomePessoa"),    
            json.getDouble("ValorUltimoCredito"), 
            json.getString("DataUltimoCredito"), 
            json.getBoolean("Status"));
    } catch (Exception e) {
        e.printStackTrace();
    }
    return jsonCartao;
}