如何使用Xpath c#检索特定节点

时间:2013-01-25 10:51:13

标签: c# xml xpath

我有一个xml文件

<BookLib>
  <Book Id="1">
    <Title>Title1</Title>
    <Author>Author1</Author>
    <Publisher>Publisher1</Publisher>
    <Subject />
  </Book>
  <Book Id="2">
    <Title>Title2</Title>
    <Author>Author2</Author>
    <Publisher>Publisher2</Publisher>
    <Subject />
  </Book>
  <Book Id="3">
    <Title>Title3</Title>
    <Author>Author3</Author>
    <Publisher>Author3</Publisher>
    <Subject />
  </Book>
</BookLib>

我想选择图书ID。我试过用这个

@"/BookLib/Book/Title[contains(translate(text(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'" + searchText + "')]/@Id";
XPathExpression

中的

如何在c#

中使用xpath检索'id'

2 个答案:

答案 0 :(得分:1)

由于@Id低于Book,而不是Id,您必须向上移动才能获得它:

@"/BookLib/Book/Title[contains(translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),'" 
      + searchText.ToLower() + "')]/../@Id";

或者首先进行比较,而不是向下移动到Title

@"/BookLib/Book[contains(translate(Title,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),'" 
      + searchText.ToLower() + "')]/@Id";

我个人更喜欢后者,因为它似乎有点清洁。

答案 1 :(得分:0)

首先,您可以使用 fn:lower-case(),它比fn:translate更好,因为它使用Unicode映射来更改大小写。所以它会像É-&gt;é,À-&gt;à等一样使用。

然后,您可以使用XPath axes 进行简化。

因此,要获得@Id,您可以使用以下XPath(适应C#):

@"//Book/Title[contains(lower-case(./text()),'" + searchText.ToLower() + "' )]/@Id";