1

我正在使用 C# 和 .NET 2.0。

鉴于下面的 XML,我想获得一个“管理员”XMLNodeList<user>节点。<role>

<users>
    <user>
        <name>John Doe</name>
        <roles>
            <role>superadmin</role>
            <role>admin</role>
        </roles>
    </user>
    <user>
        <name>Jane Doe</name>
        <roles>
            <role>superadmin</role>
            <role>admin</role>
        </roles>
    </user>
    <user>
        <name>Rob Doe</name>
        <roles>
            <role>support</role>
        </roles>
    </user>
 </users>

假设 roleName = "admin"。这有效,但区分大小写。

userNodesForRole = _document.SelectNodes("//users/user[roles[role='" + roleName + "']]");

我想以不区分大小写的方式进行操作。我知道我不能使用该matches功能,因为 .NET 2.0(也许更高?)不支持 XPath 2.0。所以我这样做了:

// abc...xyz is the string literal of the entire alphabet, of course
userNodesForRole = _document.SelectNodes("//users/user[roles[translate(role,'abc..xyz','ABC...XYZ')='" + roleName.ToUpper() + "']]", _xmlNamespaceManager);

但是,我没有得到任何节点。有人可以告诉我我做错了什么吗?

4

1 回答 1

1

_document.SelectNodes("//users/user[roles[translate(role,'abc..xyz','ABC...XYZ')='" + roleName.ToUpper() + "']]", _xmlNamespaceManager) ;

这将评估一个 XPath 表达式,如下所示:

  //users/user
           [roles
             [translate(role,
                        'abcdefghijklmnopqrstuvxyz',
                        'ABCDEFGHIJKLMNOPQRSTUVXYZ'
                        )
             =
              'ADMIN'
              ]
           ]

以及对提供的 XML 文档进行评估时的上述 XPath 表达式

<users>
    <user>
        <name>John Doe</name>
        <roles>
            <role>admin</role>
        </roles>
    </user>
    <user>
        <name>Jane Doe</name>
        <roles>
            <role>admin</role>
        </roles>
    </user>
    <user>
        <name>Rob Doe</name>
        <roles>
            <role>support</role>
        </roles>
    </user>
 </users>

选择以下节点:

<user>
    <name>John Doe</name>
    <roles>
        <role>admin</role>
    </roles>
</user>

<user>
    <name>Jane Doe</name>
    <roles>
        <role>admin</role>
    </roles>
</user>

如果有一个roles元素有多role个子元素并且<role>admin</role>元素不是role其父元素的第一个子元素,则 XPath 表达式将不会选择想要的元素。

即使在这种情况下,选择所需元素的 XPath 表达式是;

  //users/user
           [roles/role
             [translate(.,
                        'abcdefghijklmnopqrstuvxyz',
                        'ABCDEFGHIJKLMNOPQRSTUVXYZ'
                        )
             =
              'ADMIN'
              ]
           ]

第一个表达式引发异常或未选择所需节点的原因可能有多种。要找出确切原因,请打印构造的 XPath 表达式并在此处提供。

更新:@ck 现在提供了他真正的XML 文档,实际上,在真正的 XML 文档中,role孩子(<role>admin</role> 元素)不是role他们父母的第一个孩子。

所以我的猜测和解释正确的。

于 2010-08-19T03:00:48.097 回答