另一个 .NET XPath 谓词问题

发布于 2024-09-15 13:56:55 字数 1091 浏览 5 评论 0原文

给定此 XML,我想从其 节点检索 节点的 XmlNodeList ; 匹配“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>

我已经尝试过这个,期望得到“doemembers”,但它似乎没有返回任何结果。

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

Given this XML, I want to retrieve a XmlNodeList of <member> nodes from <group> nodes whose <id> matches 'Tech'. The matching should be case-insensitive.

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

I've tried this, expecting to get the "doe members", but it doesn't seem to return any results.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

本王不退位尔等都是臣 2024-09-22 13:56:55

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

I suspect the value of groupName is not what you think it is.

I compiled this example, based off your code, and I got the results you seem to be expecting:

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
Press any key to continue . . .

My other guess (a stab in the dark, since it seems to work for me!), is that you are running into issues with current language (use of translate?), or the XML document you are loading is somehow broken (byte order mark?). Basically, problems with your character streams.

惟欲睡 2024-09-22 13:56:55

再说一遍,您的 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>

Once again, most probably your XML document is not what you've shown us. Very often the reason for what seems a correct XPath expression not to work is that the document has a default namespace defined and the names used in the expressions are non-prefixed.

This C# console application:

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);
        }

    }
}

when run, produces the expected, correct result:

<member>johndoe</member>
<member>janedoe</member>
<member>robdoe</member>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文