2010-12-10 54 views
1

我有一個巨大的XML文檔。自動完成過濾器的Xpath和正則表達式

類似的東西

<?xml version="1.0" encoding="utf-8"?> 
<elements> 
<element id="1" name="france" /> 
<element id="2" name="usa" /> 
<element id="3" name="Spaïn" /> 
<element id="4" name="spain and africa" /> 
<element id="5" name="italie and Spâin" /> 
</elements> 

我想有這樣的事情:

string str = "spain"; 
XmlDocument xmlDoc = new XmlDocument();     
xmlDoc.LoadXml(myXML); 
// Xpath with regex or something very veloce 
XmlNodeList xmlNodeList = xmlDoc.SelectNodes("//element"+ something); 

而且XmlNodeList中會包含:

<element id="3" name="Spaïn" /> 
<element id="4" name="france with spâin and africa" /> 
<element id="5" name="italie and Spain" /> 

它必須忽略的情況下
和重點

目前我已經

XmlNodeList xmlNodeList = xmlDoc.SelectNodes("/*/*[contains(concat(' ',translate(translate(@n,translate(@n, 'aaabcdefghiiijklmnopqrstuvwxyzâÂABCDEFGHïÏIJKLMNOPQRSTUVWXYZ', ''),''), 'âÂABCDEFGHïÏIJKLMNOPQRSTUVWXYZ','aaabcdefghiiijklmnopqrstuvwxyz'),' '),' "+prefix+" ')]"); 

其中@n = @名稱和前綴也許是:「西班牙」或「西班牙」或「西班牙」,它給我0解決方案

+0

如果你的過濾器是用戶提供的東西,那麼一定要以某種方式逃避它。例如,如果用戶輸入一些包含xpath特殊字符的字符串,那麼'SelectNodes'可能會拋出 – 2010-12-10 14:47:53

+0

好問題,+1。請參閱我的答案,以獲取更爲一般的解決方案,該解決方案允許任何非字母字符分隔任何單詞。 :) – 2010-12-10 21:09:06

+0

@ Christophe-Debove:謝謝你讓這個問題更加有趣。看到我更新的答案。 :) – 2010-12-15 14:54:48

回答

1

UPDATE: 由於原來的問題是改變將要求識別單詞「西班牙」不僅在所有可能的市值也包括重音符號,我已經更新了下面的解決方案,因此現在「西班牙「和/或被正確識別。

這裏比@Alejandro更通用的解決方案:

如果我們要選擇所有元素,其name屬性包含單詞「西班牙」,在任何資本,如果可能的話分隔符都非字母字符,然後

這個XPath表達式

/*/*[contains(
       concat(' ', 
        translate(translate(@name, 
             translate(@name, $vAlpha, ''), 
             '               '), 
           $vUpper, 
           $vLower), 
        ' ' 
        ), 
       ' spain ' 
      ) 
    ] 

當此XML文檔上施加:

<elements> 
<element id="1" name="france" /> 
<element id="2" name="usa" /> 
<element id="3" name="Spaïn" /> 
<element id="4" name="france with spâin and africa" /> 
<element id="5" name="-Spain!" /> 
<element id="6" name="spain and africa" /> 
<element id="7" name="italie and Spain." /> 
</elements> 

選擇下列元素

<element id="3" name="Spaïn"/> 
<element id="4" name="france with spâin and africa"/> 
<element id="5" name="-Spain!"/> 
<element id="6" name="spain and africa"/> 
<element id="7" name="italie and Spain."/> 

在上述XPath表達式$vLower$vUpper必須以(分別)被取代:

'aaabcdefghiiijklmnopqrstuvwxyz' 

and

'âÂABCDEFGHïÏIJKLMNOPQRSTUVWXYZ' 

$vAlpha必須用$vLower$vUpper的連接代替。

+0

+1是的,這也是一個很好的解決方案,添加刪除標點符號的要求 – 2010-12-10 21:23:13

+0

@dimitre你可以看一下我對口音的編輯 – 2010-12-15 11:00:41

+0

@ Christophe-Debove:謝謝你讓這個問題更加有趣。看到我更新的答案。 :) – 2010-12-15 14:54:11

3

使用

//element[contains(concat(' ',translate(@name,'SPAIN','spain'),' '),' spain ')] 

編輯:現在的問題發生了變化,但得到的答覆仍然是...

在翻譯模式只需添加這些變化,如:

//element[contains(concat(' ', 
          translate(@name, 
            'SPAÂâIÏïN', 
            'spaaaiiin'), 
          ' '), 
        ' spain ')] 

注:當然,一個更一般的表達式將需要一個更一般的翻譯模式。

+1

喲Alejandro你能解釋一下加concat的用法嗎? – Treemonkey 2010-12-10 14:44:17

+1

@Treemonkey:是的。 '包含(@ name,'spain')'會匹配「spainly」。 – 2010-12-10 14:52:57

+0

如果名稱只是name =「spain」,那麼它是否仍然會獲得元素,因爲沒有空格?感謝回覆:) – Treemonkey 2010-12-10 14:59:45

2
string str = "spain"; 
XmlDocument xmlDoc = new XmlDocument();     
xmlDoc.LoadXml(myXML); 
// Xpath with regex or something very veloce 
XmlNodeList xmlNodeList = xmlDoc.SelectNodes("//element[contains(@name,'spain')]");