2015-05-29 88 views
2

我想通過Xpath不區分大小寫來搜索節點。通過XPath選擇屬性不區分大小寫的節點

<Validation> 
    <Presentation> 
     <Slide Tag= "Test"> 
      <FontSize Value = "36"/> 
     </Slide> 
    </Presentation> 
</Validation> 

我用這個代碼

String xPath = string.Format("/Validation/Presentation/Slide[lower-case(@Tag)='{0}'][1]", "test"); 
XmlNode node = doc.DocumentElement.SelectSingleNode(xPath); 

但它拋出一個XPath例外:需要命名空間管理器或XsltContext。該查詢具有前綴,變量或用戶定義的函數。我哪裏做錯了?

+0

當您使用的XPath :)。但嚴重的是,這裏有沒有理由不使用XDocument? – Jonesopolis

+0

你的答案就在這裏 獲取使用XPath屬性 http://stackoverflow.com/questions/4531995/getting-attribute-using-xpath – bilal

+0

@bilal是的,但我也需要區分大小寫.. – Matt3o

回答

4

你試過嗎?
INFO:使用XPath與MSXML執行不區分大小寫的搜索: https://support.microsoft.com/en-us/kb/315719

使用translate

doc.DocumentElement.selectSingleNode("/Validation/Presentation/Slide[translate(@Tag, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'test']") 
+1

雖然這個鏈接可能回答問題,最好在這裏包含答案的重要部分,並提供參考鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – Joel

+0

明白了。謝謝。 –

2

lower-case是的XPath 2.0功能和.NET本身僅支持XPath 1.0中的表達,這樣你就可以」不要這樣使用它。

或者您可以使用Linq2Xml:

var doc = XDocument.Load(@"your_file_Name"); 
var node = doc.XPathSelectElements("/Validation/Presentation/Slide") 
       .FirstOrDefault(x => x.Attribute("Tag") != null 
            && String.Equals(x.Attribute("Tag").Value, "test", 
               StringComparison.CurrentCultureIgnoreCase)); 
8

.NET不支持的XPath 2.0。

所以,你可以使用這個可憎

/Validation/Presentation/Slide[translate(@Tag, 
    'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
    'abcdefghijklmnopqrstuvwxyz')= 'test'] 

(我硬編碼的價值爲便於與XPathBuilder測試。)

+0

謝謝!!有用!! – Matt3o

相關問題