2015-05-29 3 views
2

Я хотел бы искать узел через Xpath case insensitve.Выберите узел с регистром без учета регистра с помощью XPath

<Validation> 
    <Presentation> 
     <Slide Tag= "Test"> 
      <FontSize Value = "36"/> 
     </Slide> 
    </Presentation> 
</Validation> 

Я использовал этот код

String xPath = string.Format("/Validation/Presentation/Slide[lower-case(@Tag)='{0}'][1]", "test"); 
XmlNode node = doc.DocumentElement.SelectSingleNode(xPath); 

но он бросает XPath Исключения: пространство имен менеджер или XsltContext необходимо. Этот запрос имеет префикс, переменную или пользовательскую функцию. Где я неправ?

+0

Когда вы использовали XPath :). Но серьезно, есть ли причина не использовать XDocument здесь? – Jonesopolis

+0

Ваш ответ здесь Получение атрибута с помощью XPath http://stackoverflow.com/questions/4531995/getting-attribute-using-xpath – bilal

+0

@bilal да, но мне также нужна нечувствительность к регистру. – Matt3o

ответ

4

Вы пробовали это?
INFO: Использование XPath Выполнение регистронезависимом Поиск с MSXML: https://support.microsoft.com/en-us/kb/315719

использование translate

doc.DocumentElement.selectSingleNode("/Validation/Presentation/Slide[translate(@Tag, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'test']") 
+1

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – Joel

+0

Получил. Благодарю. –

2

lower-case является XPath 2.0 функция и сама .NET поддерживает только XPath 1.0 выражения, так что вы можете» t использовать его таким образом.

В качестве альтернативы вы можете использовать Linq2Xml:

var doc = XDocument.Load(@"your_file_Name"); 
var node = doc.XPathSelectElements("/Validation/Presentation/Slide") 
       .FirstOrDefault(x => x.Attribute("Tag") != null 
            && String.Equals(x.Attribute("Tag").Value, "test", 
               StringComparison.CurrentCultureIgnoreCase)); 
8

.NET не поддерживает XPath 2.0.

Таким образом, вы можете использовать эту мерзость:

/Validation/Presentation/Slide[translate(@Tag, 
    'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
    'abcdefghijklmnopqrstuvwxyz')= 'test'] 

(я жёстко свою ценность в для удобства тестирования с XPathBuilder.)

+0

спасибо !! оно работает!! – Matt3o

Смежные вопросы