Xpath和regex用于自动完成过滤器

时间:2010-12-10 14:35:26

标签: c# xml xpath xmldocument

我有一个巨大的xml文档。

类似的东西

<?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 = @name和前缀可能是:“西班牙”或“西班牙”或“Spaïn”它给我0解决方案

3 个答案:

答案 0 :(得分:3)

使用

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

修改:现在,问题已经改变,但答案仍然是......

只需在翻译模式中添加这些更改,例如:

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

注意:当然,更通用的表达式需要更通用的翻译模式。

答案 1 :(得分: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')]");  

答案 2 :(得分:1)

<强>更新: 由于最初的问题发生了变化,增加了识别单词“西班牙”的要求,不仅在所有可能的大写字母中,还包括重音字符,我已经更新了下面的解决方案,现在“西班牙”与â和/或ïÏ被正确识别。

这是一个比@Alejandro 更通用的解决方案:

如果我们要选择所有元素,其name属性在任何大小写中包含单词“Spain”,并且可能的单词分隔符都是非字母字符,那么

此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'

'âÂABCDEFGHïÏIJKLMNOPQRSTUVWXYZ'

$vAlpha必须由$vLower$vUpper的串联替换。