2011-09-05 108 views
3

好了,所以我有一些示例XML,看起來像這樣:Xpath查詢「喜歡」替代

<Node name="details"> 
    <Node name="1130482269"> 
     <Val name="type"><u>2</u></Val> 
     <Val name="owner"><n/></Val> 
     <Val name="account_number"><u>99-71-39</u></Val> 
    </Node> 
    <Node name="570722270"> 
     <Val name="type"><u>2</u></Val> 
     <Val name="owner"><n/></Val> 
     <Val name="account_number"><u>99 71 40</u></Val> 
    </Node> 
    <Node name="1845243341"> 
     <Val name="type"><u>2</u></Val> 
     <Val name="owner"><n/></Val> 
     <Val name="account_number"><u>9971-41</u></Val> 
    </Node> 
</Node> 

我試圖做基於ACCOUNT_NUMBER搜索。但有這麼多不同的格式,它可以在一些有空格,有的有破折號,有些還混合等。如果我能夠做一個搜索去掉空格和破折號,我應該能夠得到任何帳號。

隨着ACCOUNTNUMBER是搜索查詢,最終的目標是在做XPATH搜索這樣做是爲了獲得第二層次的節點名稱數量:

doc = libxml2.parseDoc(xml) 
ctxt = doc.xpathNewContext() 
res = ctxt.xpathEval("/Node/Node[Val[@name='account_number']/*='" + str(accountnumber) + "']/@name") 

是否有使用XPath搜索的方式,去除所有破折號和空格,只留下數字?

感謝

+0

廣東話你替換所有「」和」?將它們從您的文本中刪除?林不熟悉Python,但據我所知是沒有辦法做你想要什麼使用XPath只 –

+0

也許我可以做一個巨大的,如果:-( – itwb

+1

你或許可以創建一個正則表達式語句來替換任何「 - 」或' 「那是<值名稱=‘ACCOUNT_NUMBER’>標籤或查詢之間的所有瓦爾[@account_number]使用XPath節點和重寫他們的價值 –

回答

2

是的,有可能使用translate()功能。例如:

"translate(Node/Node[@name='1130482269']/Val[@name='account_number'],'- ','')" 

將輸出997139

可以使用,然後(代碼行打破了可讀性):

"translate(
    /Node/Node[@name='" + 
    str(accountnumber) + 
    "']/Val[@name='account_number'],'- ','')" 

注意列入的第二個參數的空白翻譯必要'- '(甚至'-&#x20;')刪除空格。

+1

如果你需要一個自定義功能一定要規範你的數據,而不是翻譯,你可以製作自己的擴展功能:http://lxml.de/extensions.html – Udi

0

不幸的是,libxml2的環境只支持XPath 1.0,所以你沒有訪問的XPath 2.0的正則表達式功能,如火柴()函數。然而,它確實有支持添加自己的擴展函數(見http://xmlsoft.org/XSLT/extensions.html),所以你可以考慮這個做自己。什麼也沒有「 -