[英]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.