【问题标题】:Yet another .NET XPath predicate question另一个 .NET XPath 谓词问题
【发布时间】:2010-08-20 03:26:16
【问题描述】:

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

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

【问题讨论】:

  • 查看我的回答,猜测您再次没有向我们展示真正的 XML 文档 :)
  • 请将您的问题的标题更新为更相关的内容。

标签: c# .net xpath predicate translate


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多