0

鉴于此 XML,我想从匹配“技术”XmlNodeList的节点中检索一个<member>节点。匹配应该不区分大小写。<group><id>

   <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 members”,但它似乎没有返回任何结果。

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

2 回答 2

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 文档以某种方式损坏(字节顺序标记?)。基本上,你的字符流有问题。

于 2010-08-20T03:38:19.697 回答
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() +@"'
            ]
             /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>
于 2011-11-18T00:26:58.643 回答