另一个.NET XPath谓词问题

时间:2010-08-20 03:26:17

标签: c# .net xpath predicate translate

鉴于此XML,我想从XmlNodeList匹配'Tech'的<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成员”,但它似乎没有返回任何结果。

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

2 个答案:

答案 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
按任意键继续。 。

我的另一个猜测(在黑暗中刺伤,因为它似乎对我有用!),是你遇到了当前语言(使用translate?)或XML的问题你加载的文件是否以某种方式被破坏(字节顺序标记?)。基本上,你的角色流问题。

答案 1 :(得分: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>