繁体   English   中英

Xpath和regex用于自动补全过滤器

[英]Xpath and regex for autocompletion filter

我有一个巨大的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和prefix可能是:“ spain”或“ Spain”或“Spaïn”,它给了我0解决方案

采用

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

编辑 :现在,问题已更改,但答案仍然...

只需在翻译模式中添加以下更改即可:

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

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

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')]");  

更新 :由于原来的问题是改变将要求识别单词“西班牙”不仅在所有可能的市值也包括重音符号,我已经更新了下面的解决方案,使现在的“西班牙”与AA和/或II是正确的公认的。

这是一个比@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的串联$vUpper

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM