2010-08-20 3 views
0

Учитывая этот XML, я хочу получить XmlNodeList узлов <member> от <group> узлов, <id> соответствует «Tech». Согласование должно быть нечувствительным к регистру.Еще один вопрос предиката .NET XPath

<groups> 
     <group> 
      <id>Tech</id> 
      <members> 
       <member>johndoe</member> 
       <member>janedoe</member> 
       <member>robdoe</member> 
      </members> 
     </group> 
     <group> 
      <id>Support</id> 
      <members> 
       <member>johnfoe</member> 
       <member>janefoe</member> 
       <member>robfoe</member> 
      </members> 
     </group> 
    </groups> 

Я попытался это, ожидая, чтобы получить «членов Doe», но это, кажется, не дал никаких результатов.

 // assume groupName='tech' 
    _document.SelectNodes("//groups/group[translate(id,'abcdefghijklmnopqrstuvxyz','ABCDEFGHIJKLMNOPQRSTUVXYZ')='" + groupName.ToUpper() + "']/members/member"); 
+0

Смотрите мой ответ на предположение, что вы снова не показывая нам реальный XML-документ :) –

+0

Пожалуйста, обновите заголовок своего вопроса на что-то более актуальное. –

ответ

0

Я подозреваю, что значение groupName не то, что вы думаете.

Я составил этот пример, на основе свой код, и я получил результаты, кажется вам ожидать:

var doc = new XmlDocument(); 
doc.LoadXml(
@"<groups> 
    <group> 
     <id>Tech</id> 
     <members> 
      <member>johndoe</member> 
      <member>janedoe</member> 
      <member>robdoe</member> 
     </members> 
    </group> 
    <group> 
     <id>Support</id> 
     <members> 
      <member>johnfoe</member> 
      <member>janefoe</member> 
      <member>robfoe</member> 
     </members> 
    </group> 
</groups>"); 
foreach (XmlElement node in doc.SelectNodes("//groups/group[translate(id,'abcdefghijklmnopqrstuvxyz','ABCDEFGHIJKLMNOPQRSTUVXYZ')='" + "tech".ToUpper() + "']/members/member")) 
    Console.WriteLine(node.InnerText); 

JohnDoe
JaneDoe
robdoe
Нажмите любую клавишу для продолжения. , ,

Моей другая догадка (удар в темноте, так как , кажется, работает для меня!), является то, что вы работаете с проблемами с текущим языком (использованием переводом?), Или документ XML вы загрузка как-то сломана (отметка порядка байтов?). В основном, проблемы с потоками персонажа.

0

Еще раз, скорее всего, ваш XML-документ - это не то, что вы нам показали. Очень часто причина того, что кажется правильным выражением XPath не работать, заключается в том, что документ имеет пространство имен по умолчанию и имена, используемые в выражениях, не имеют префикса.

Это # консольное приложение C:

using System; 
using System.Xml; 

class TestXPath 
{ 
    static void Main(string[] args) 
    { 
     string xmlText = 
@"<groups> 
    <group> 
     <id>Tech</id> 
     <members> 
      <member>johndoe</member> 
      <member>janedoe</member> 
      <member>robdoe</member> 
     </members> 
    </group> 
    <group> 
     <id>Support</id> 
     <members> 
      <member>johnfoe</member> 
      <member>janefoe</member> 
      <member>robfoe</member> 
     </members> 
    </group> 
</groups>"; 

     XmlDocument doc = new XmlDocument(); 
     doc.LoadXml(xmlText); 

     string groupName = "tech"; 

     string xpathExpr = 
@"//groups/group 
      [translate(id,'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ') 
      ='" 
      + groupName.ToUpper() [email protected]"' 
      ] 
      /members/member"; 

     XmlNodeList selection = doc.SelectNodes(xpathExpr); 

     foreach (XmlNode node in selection) 
     { 
      Console.WriteLine(node.OuterXml); 
     } 

    } 
} 

при запуске, производит ожидаемый, правильный результат:

<member>johndoe</member> 
<member>janedoe</member> 
<member>robdoe</member> 
Смежные вопросы