我有一个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'答案 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";