2010-08-19 74 views
1

我正在使用C#和.NET 2.0。如何在XmlDocument.SelectNodes的XPath参数的谓词中使用translate函数?

鉴于下面的XML,我想获得一个XMLNodeList<user>节点,其中<role>是“admin”。

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

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

+0

顺便说一句,C#与您的问题并不真正相关。这是一个.NET 2.0的问题,你恰好在用C#编程。 – 2010-08-19 02:23:57

+0

当你尝试使用你的代码调用'translate'时会发生什么?它在表面上看起来很好。 – Jacob 2010-08-19 02:56:44

回答

1

_document.SelectNodes( “//用户/用户[角色[翻译(角色, 'abc..xyz', 'ABC ... XYZ')='” + roleName.ToUpper()+“ ']]“,_xmlNamespaceManager);

此计算的XPath表达式如下所示:

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

和上述XPath表达式所提供的XML文档评价时:

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

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

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

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

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

更新:@ck现在已经提供了他的真正 XML文档而事实上,真正的XML文档中的role儿童(<role>admin</role>元素)arenot第一role孩子他们的父母的。

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

+0

谢谢。你击中了要害。我编辑了这个问题以反映我正在试图更仔细解析的实际XML。 但是我也有类似的问题。我会分开发布。 – 2010-08-20 03:16:14

+0

@ck:不客气。 – 2010-08-20 04:03:56