2010-08-19 28 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