0

我有一个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>

我想选择书号。我试过用这个

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

XPathExpression

如何在 c# 中使用 xpath 检索“id”

4

2 回答 2

1

因为@Id是 below Book, not Id,所以你必须向上移动才能得到它:

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

或者进行比较而不首先移动到Title

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

我个人更喜欢后者,因为它看起来更干净一些。

于 2013-01-25T10:56:11.750 回答
0

首先,您可以使用fn:lower-case(),它fn:translate更好,因为它使用 Unicode 映射来更改大小写。所以它可以与 É->é、À->à 等重音一起使用。

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

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

@"//Book/Title[contains(lower-case(./text()),'" + searchText.ToLower() + "' )]/@Id";
于 2013-01-25T14:37:27.880 回答