C# Xpath和正则表达式用于自动完成过滤器
我有一个巨大的xml文档 诸如此类C# Xpath和正则表达式用于自动完成过滤器,c#,xml,xpath,xmldocument,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" /> <
<?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>
xmlNodeList将包含:
<element id="3" name="Spaïn" />
<element id="4" name="france with spâin and africa" />
<element id="5" name="italie and Spain" />
其中@n=@名称和前缀可能是:“西班牙”或“西班牙”或“西班牙”,它为我提供了0个解决方案
//element[contains(concat(' ',translate(@name,'SPAIN','spain'),' '),' spain ')]
编辑:现在,问题已经改变,但答案仍然是
只需在翻译模式中添加以下更改:
//element[contains(concat(' ',
translate(@name,
'SPAÂâIÏïN',
'spaaaiiin'),
' '),
' spain ')]
注意:当然,更通用的表达式需要更通用的翻译模式。使用
//element[contains(concat(' ',translate(@name,'SPAIN','spain'),' '),' 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')]");
编辑:现在,问题已经改变,但答案仍然是
只需在翻译模式中添加以下更改:
//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')]");
由于最初的问题被修改,增加了识别单词“西班牙”的要求,不仅在所有可能的大写字母中,而且还包括重音字符,因此我更新了下面的解决方案,以便现在正确识别带有和/或的“西班牙”
这里有一个比@Alejandro更通用的解决方案:
/*/*[contains(
concat(' ',
translate(translate(@name,
translate(@name, $vAlpha, ''),
' '),
$vUpper,
$vLower),
' '
),
' spain '
)
]
<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."/>
如果我们要选择所有元素,其name
属性在任何大小写中都包含单词“西班牙”,并且如果可能的单词分隔符都是非字母字符,那么
此XPath表达式:
/*/*[contains(
concat(' ',
translate(translate(@name,
translate(@name, $vAlpha, ''),
' '),
$vUpper,
$vLower),
' '
),
' spain '
)
]
<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."/>
应用于此XML文档时:
/*/*[contains(
concat(' ',
translate(translate(@name,
translate(@name, $vAlpha, ''),
' '),
$vUpper,
$vLower),
' '
),
' spain '
)
]
<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."/>
及
$vAlpha
必须由$vLower
和$vUpper
的串联替换更新:
由于最初的问题被修改,增加了识别单词“西班牙”的要求,不仅在所有可能的大写字母中,而且还包括重音字符,因此我更新了下面的解决方案,以便现在正确识别带有和/或的“西班牙”
这里有一个比@Alejandro更通用的解决方案:
/*/*[contains(
concat(' ',
translate(translate(@name,
translate(@name, $vAlpha, ''),
' '),
$vUpper,
$vLower),
' '
),
' spain '
)
]
<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."/>
如果我们要选择所有元素,其name
属性在任何大小写中都包含单词“西班牙”,并且如果可能的单词分隔符都是非字母字符,那么
此XPath表达式:
/*/*[contains(
concat(' ',
translate(translate(@name,
translate(@name, $vAlpha, ''),
' '),
$vUpper,
$vLower),
' '
),
' spain '
)
]
<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."/>
应用于此XML文档时:
/*/*[contains(
concat(' ',
translate(translate(@name,
translate(@name, $vAlpha, ''),
' '),
$vUpper,
$vLower),
' '
),
' spain '
)
]
<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."/>
及
$vAlpha
必须由$vLower
和$vUpper
的串联替换。你能解释一下添加concat的用法吗?@Treemonkey:是的contains(@name,'spain')
将匹配“spainly”。由于没有空格,如果名称仅为name=“spain”,它还会得到元素吗?谢谢你的回复:)@Treemonkey:是的,因为前面和后面的空格连接到@name
。你能删除答案的//以使其具有语法色彩吗?你能解释一下添加concat的用法吗?@Treemonkey:是的contains(@name,'spain')
将匹配“spainly”。由于没有空格,如果名称仅为name=“spain”,它还会得到元素吗?谢谢回复:)@Treemonkey:是的,因为前导空格和尾随空格连接到@name
。您能否删除答案的//以使其具有语法颜色?如果您的筛选器是用户提供的,请务必以某种方式将其转义。例如,如果用户输入一些包含xpath特殊字符的字符串,则SelectNodes
可能会提出一个很好的问题,+1。有关允许任何非字母字符分隔任何单词的更通用解决方案,请参见我的答案。:)@克里斯托夫·德博夫:谢谢你让这个问题变得更加有趣。请参阅我的最新答案。:)@克里斯托夫·德博夫:我已经做了详尽的搜索,看来我的解决方案可能是解决你问题的唯一方法。特别是,没有办法在正则表达式中为“a的所有重音字符”或任何单个特定字符指定字符类。这意味着即使使用正则表达式,也必须枚举所有重音字符。因此,如果一个人决定编写一个正则表达式,那么他将不会得到比我的解决方案更好的结果。如果你的过滤器是用户提供的,那么一定要设法避开它。例如,如果用户输入一些包含xpath特殊字符的字符串,则SelectNodes
可能会提出一个很好的问题,+1。有关允许任何非字母字符分隔任何单词的更通用解决方案,请参见我的答案。:)@克里斯托夫·德博夫:谢谢你让这个问题变得更加有趣。请参阅我的最新答案。:)@克里斯托夫·德博夫:我已经做了详尽的搜索,看来我的解决方案可能是解决你问题的唯一方法。特别是,没有办法在正则表达式中为“a的所有重音字符”或任何单个特定字符指定字符类。这意味着即使使用正则表达式,也必须枚举所有重音字符。因此,如果一个人决定写一个正则表达式来代替,他将不会得到比我的解决方案更好的结果。+1是的,这也是一个很好的解决方案,添加了删除的要求punctuation@Christophe-德博:谢谢你让这个问题变得更有趣。请参阅我的最新答案。:)@迪米特里:这可能行得通,但我正在寻找一种更自动的方式,以你的方式,我们不能避免错过一些琐碎的东西(非拉丁语)caracter@Christophe-德博夫:不仅“它能工作”,而且它能工作!至于将其用作“自动”解决方案——是的,只需将所有重音字符以我的解决方案中演示的方式添加到$vLower
和$vUpper
变量中——只有几个元音,每个元音只有几个重音变体。您介意XPath 2.0解决方案吗(您可能需要访问非标准XPath(2.0)引擎,如Saxon或XQSharp)?@Dimitre可能是我,但我不是来让它工作的,我编辑我的问题以添加我的C代码+1是的,不是