搜索xml以查找与unix中某些输入相对应的节点值

时间:2014-07-15 13:27:26

标签: xml bash shell unix xpath

我有以下xml文件

<?xml version="1.0" encoding="UTF-8"?>
  <datasources>
    <local-tx-datasource>
      <jndi-name>jdbc/pvhrm_CC_tu</jndi-name>
      <connection-url>jdbc:db2:CCTST1</connection-url>
    </local-tx-datasource>
    <local-tx-datasource>
      <jndi-name>jdbc/pvhrm_SLB_tu</jndi-name>
      <connection-url>jdbc:db2:slbtst1</connection-url>
    </local-tx-datasource>
  </datasources>

我想知道使用shell脚本的特定jndi-name的connection-url。 假设输入是jdbc / pvhrm_CC_tu然后我想要dbc:db2:CCTST1作为输出。 我是UNIX的新手。我尝试了xmllint --xpath,但是找不到xpath选项的错误。 还有其他选择。

3 个答案:

答案 0 :(得分:0)

这些行可以帮到你:

编辑:

parameter=$(echo "YOURPARAMETER" | sed "s/\//\\\\\//g")  #e.g. : jdbc/pvhrm_CC_tu
cat YOURXMLFILE| tr '\n' ' ' | sed "s/^.*<jndi-name>$parameter<\/jndi-name>[ ]*<connection-url>\(.\{14,17\}\)<\/connection-url>.*/\1\n/g"

用某些词语:
- 输入你的参数:你的jndi-name;第一个sed表达式将逃脱斜线 - tr表达式将全部放在一条线上 - sed表达式将替换&#34; jdbc / pvhrm_CC_tu       JDBC:DB2:CCTST1&#34;通过jdbc:db2:CCTST1,如果它是正确的。

此表达式适用于连接网址,其长度介于14和17个字符之间

答案 1 :(得分:0)

您可以安装XMLStarlet,之后您可以执行以下操作:

xmlstarlet sel -t -v "//jndi-name[. = 'jdbc/pvhrm_CC_tu']/following-sibling::connection-url" myfile.xml

或者,您可以安装具有--xpath选项的较新版libxml2

答案 2 :(得分:0)

使用XMLStarlet:

name=jdbc/pvhrm_CC_tu # example value
[[ $name = *"'"* ]] && { echo "ERROR: Injection attempt" >&2; exit 1; }
xmlstarlet sel \
  -t -m "//datasources[jndi-name='$name']/connection-url" -v . \
  <input.xml

这里的注入检查可能过多,但无论何时将数据替换为代码,都是一个好习惯。 (设计得更好的界面根本不允许这样的替换,但总是将扩展视为数据而不是代码)。