2017-01-09 2 views
0

Я пытаюсь использовать пример ниже, чтобы выбрать узел, проигнорировав случай, и select single node retuns null.Игнорирующий случай в SelectSingleNode Xpath не работает.

XmlDocument doc = new XmlDocument(); 
    doc.LoadXml("<root><CHILD1>c1</CHILD1><CHILD2>c2</CHILD2></root>"); 
    var node = doc.SelectSingleNode("root"); 
    string nodeXpath = string.Format("//*[translate(@key, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = '{0}']","child1"); 
    node = node.SelectSingleNode(nodeXpath); 
    string innertext = node.InnerText; 

Может кто-то помочь.

ответ

1

@key в XPath означает ссылку на атрибут с именем key. В вашем XML нет такого атрибута. Если вы имели в виду, чтобы соответствовать по имени элемента, то вы должны использовать name() или local-name() вместо:

... 
string xpath = "//*[translate(name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = '{0}']"; 
string nodeXpath = string.Format(xpath,"child1"); 
... 
+0

Спасибо @ har07. Оно работает. –

1

Вы можете использовать LINQ для Xml в маленькой ставки более читаемым образом

XDocument doc = XDocument.Parse("<root><CHILD1>c1</CHILD1><CHILD2>c2</CHILD2></root>"); 
var singleNode = 
    doc.Root 
     .Elements() 
     .FirstOrDefault(element => element.Name.ToString().ToLower().Equals("child1")); 

Но обратите внимание, что XML поддерживать разные узлы, где имя может быть чувствительным к регистру (например, «узел» и «узел») и «поиск» элементов в способе «игнорировать» может привести к проблемам в будущем.

+0

Спасибо, Фабио, за ваши комментарии. Существующий старый код имеет эту проблему и должен быть исправлен с помощью отдельного узла для минимальных изменений. следовательно, собирается с har07 –