Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xpath和正则表达式用于自动完成过滤器_C#_Xml_Xpath_Xmldocument - Fatal编程技术网

C# Xpath和正则表达式用于自动完成过滤器

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文档

诸如此类

<?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是的,不是