Xpath и регулярное выражение для фильтра автозаполнения - PullRequest
1 голос
/ 10 декабря 2010

У меня огромный 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 ]

3 голосов
/ 10 декабря 2010

Используйте

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

Редактировать : Теперь вопрос изменился, но ответ остается ...

Просто добавьте эти изменения в шаблон перевода как:

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

Примечание: Конечно, для более общего выражения потребуется более общий шаблон перевода.

2 голосов
/ 10 декабря 2010
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')]");  
1 голос
/ 11 декабря 2010

UPDATE : Поскольку исходная задача была изменена, добавив требование распознавать слово «Испания» не только во всех возможных заглавных буквах, но также включая символы с акцентом, я обновил решение, приведенное ниже, чтобы теперь «Испания» с â и / или • 1006 * правильно распознано.

Вот более общее решение, чем у @ Alejandro :

Если мы хотим выбрать все элементы, чей атрибут name содержит слово «Испания» в любой прописной букве, и если все возможные разделители слов не алфавитные символы, то

Это выражение 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.

...