2014-07-15 14 views
0

我有以下XML文件搜索XML來找到對應於一些輸入在UNIX

<?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名稱節點值。 假設輸入是jdbc/pvhrm_CC_tu,那麼我需要dbc:db2:CCTST1作爲輸出。 我是UNIX新手。我嘗試了xmllint --xpath,但得到xpath選項未找到的錯誤。 有沒有其他的選擇。

+0

你可以安裝XMLStarlet(http://xmlstar.sf.net/)嗎? –

回答

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名稱;第一SED表達式將第逸出斜線
- 對TR表達將PU上的所有事務所線
- 桑達表達將取代「JDBC/pvhrm_CC_tu JDBC:DB2:CCTST1」由JDBC:DB2:CCTST1如果它是正確的。

這種表達的作品,一個連接的URL其中有14 & 17個字符

之間的長度
+0

我收到以下錯誤。 sed:command亂碼:s/ jdbc/pvhrm_CC_tu \ n \(* \)/\ 1/g – user55926

+0

好的,我編輯了sed表達式,它非常可怕,但它的工作原理。 ..我希望它會幫助你! :) – Fabien

+0

作品...輸入*精確*作爲給定。許多其他編寫完全相同的XML結構的方法都不起作用,這使得它非常脆弱。 –

0

你可以安裝XMLStarlet,在這之後,你可以這樣做:

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

或者,你可以安裝具有--xpath選項的libxml2的較新版本。

+0

好的方法,但這是一個相當複雜的編寫查詢的方式,不是嗎? –

+0

不確定有多複雜 - 我自己覺得這很合乎邏輯。也就是說,我更喜歡你的版本;這只是第一個彈出到我腦海中的版本。 –

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 

注射檢查可能是過分的在這裏,但一個良好的習慣是在無論每當一個替代的數據轉換成代碼。 (設計更好的界面根本不允許這種替換,但總是將擴展視爲數據而不是代碼)。

相關問題