在 xml 文件 bash 脚本中搜索值

Search for value in xml file bash script

我有 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,我想检查这个 ID 是否存在于我的 xml 文件中。 我尝试这样的事情:

'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 脚本

有点菜鸟

我认为 $content 包含文件的 contents,而您使用的工具希望您传递 name 的文件。它正在将您的 XML(如 <version>1.0.0</version>)的每个 "word" 视为文件路径,但找不到文件路径,因此正在抱怨。

我还注意到您正在使用 --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

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

$ grep -q $ID file.xml && echo exists

编辑 排除部分匹配:

$ grep ">${ID}<" file.xml && echo exists