Еще один вопрос о предикате .NET XPath - PullRequest
0 голосов
/ 20 августа 2010

Учитывая этот XML, я хочу получить XmlNodeList из <member> узлов из <group> узлов, чей <id> соответствует 'Tech'. Соответствие должно быть без учета регистра.

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

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

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

Ответы [ 2 ]

0 голосов
/ 18 ноября 2011

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

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() +@"'
            ]
             /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>
0 голосов
/ 20 августа 2010

Я подозреваю, что значение 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Джейн ДоуrobdoeНажмите любую клавишу для продолжения .,.

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

...