2017-01-17 33 views
1

我需要通过忽略大小写来获取使用来自xml下的XPath的<aw:Child1>元素。使用XPathSelectElements不区分大小写的元素选择

<aw:Root xmlns:aw='http://www.test-works.com'> 
    <aw:Child uid='Test1'>child one data 1</aw:Child> 
    <aw:Child uid='Test2'>child one data 2</aw:Child> 
    <aw:Child uid='Test3'>child one data 3</aw:Child> 
</aw:Root> 

这里是我的代码,但它不会返回任何元素:

 string markup = @" 
<aw:Root xmlns:aw='http://www.test-works.com'> 
    <aw:Child uid='Test1'>child one data 1</aw:Child> 
    <aw:Child uid='Test2'>child one data 2</aw:Child> 
    <aw:Child uid='Test3'>child one data 3</aw:Child> 
</aw:Root>"; 
      var reader = XmlReader.Create(new StringReader(markup)); 
      var root = XElement.Load(reader); 
      var nameTable = reader.NameTable; 
      var namespaceManager = new XmlNamespaceManager(nameTable); 
      namespaceManager.AddNamespace("aw", "http://www.test-works.com"); 

      var inputQuery = "./aw:Child[@uid='test1']"; //Auto generated 

      var elements = root.XPathSelectElements(inputQuery, namespaceManager); 
      foreach (var el in elements) 
       Console.WriteLine(el); 

我得到的结果时,我将路径更改为正确的情况下

var inputQuery = "./aw:Child[@uid='Test1']"; 

但是相匹配的元素动态生成,并且始终为小写。有没有办法在匹配元素时忽略大小写?

+1

Xml是区分大小写的,为什么你要以不区分大小写的方式选择元素?无论如何,你可以选择所有的元素(即在这种情况下使用'/ */*')并检查'foreach'循环中的名称/过滤器。 – Pawel

回答

0

您可以使用XPath 1.0 translate()函数将所有大写字符替换为小写字母。 在你的情况下它将是:

var inputQuery = "./aw:Child[translate(@uid, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')='test1']"; 
相关问题