XPath: chọn nút văn bản


150

Có XML sau:

<node>Text1<subnode/>text2</node>

Làm cách nào để tôi chọn nút văn bản thứ nhất hoặc thứ hai qua XPath?

Một cái gì đó như thế này:

/node/text()[2]

tất nhiên không hoạt động vì đó là kết quả hợp nhất của mọi văn bản bên trong nút.


11
Bạn đã viết: /node/text()[2][...] không hoạt động vì đó là kết quả hợp nhất của mọi văn bản bên trong nút Điều đó sai: nó có nghĩa là nút con văn bản thứ hai của nodephần tử gốc . Các giá trị chuỗi (nối các nút văn bản hậu duệ) sẽ làstring(/node)

Bạn có nghĩa là truy vấn Xpath nên hoạt động? Chà, tôi đoán là tôi có một vấn đề khác ở đâu đó rồi. ;) Cảm ơn!
hạt nhân

Câu hỏi hay, +1. Xem câu trả lời của tôi để được giải thích và một số biểu thức XPath chọn tất cả hoặc một nút con văn bản cụ thể của phần tử trên cùng.
Dimitre Novatchev

Câu trả lời:


183

Có XML sau:

<node>Text1<subnode/>text2</node> 

Làm cách nào để tôi chọn nút văn bản thứ nhất hoặc thứ hai qua XPath?

Sử dụng :

/node/text()

Cái này chọn tất cả các nút con văn bản của phần tử trên cùng (được đặt tên là "nút") của tài liệu XML.

/node/text()[1]

Cái này chọn con nút văn bản đầu tiên của phần tử trên cùng (được đặt tên là "nút") của tài liệu XML.

/node/text()[2]

Cái này chọn con nút văn bản thứ hai của phần tử trên cùng (được đặt tên là "nút") của tài liệu XML.

/node/text()[someInteger]

Cái này chọn con nút văn bản someInteger-th của phần tử trên cùng (được đặt tên là "nút") của tài liệu XML. Nó tương đương với biểu thức XPath sau:

/node/text()[position() = someInteger]

@NaftuliTzviKay: Điều này có nghĩa là Chrome bị hỏng. /node[2]không được chọn bất kỳ nút nào nếu tài liệu XML nguồn được định dạng tốt. Theo định nghĩa trong một tài liệu XML được hình thành tốt, chỉ có một yếu tố hàng đầu (duy nhất) - còn được gọi làdocument-element
Dimitre Novatchev

1
Cái này có hoạt động trong PHP không? Tôi đang cố gắng lặp qua các nút văn bản, ngay cả những nút ở giữa một bộ thẻ. Vấn đề là đập vỡ nội dung của nhiều nút văn bản với nhau, bất kể thẻ. Sử dụng //*[text()]anyway. /html/text()không hoạt động.
Aaron Gillion

2
@AaronGillion, Có, AFAIK PHP có đánh giá XPath 1.0 hoạt động chính xác. Xin lưu ý rằng /html/text()không chọn tất cả các nút văn bản trong tài liệu - chỉ các nút văn bản là con (không phải con cháu) của htmlphần tử trên cùng . Bạn có thể muốn /html//text() . Một số kiến ​​thức và hiểu biết về XPath thường được yêu cầu để xây dựng các biểu thức XPath.
Dimitre Novatchev

Cảm ơn. Tôi đã tìm ra thủ thuật chém đôi một chút trước đây!
Aaron Gillion

@AaronGillion, Chào mừng bạn. Bạn có thể tìm hiểu những điều cơ bản về XPath 1.0 và 2.0 trong mô-đun 2 của khóa đào tạo trực tuyến này: pluralsight.com/cifts/xslt-foundations-part1
Dimitre Novatchev

29

xpath của bạn nên hoạt động. tôi đã kiểm tra xpath của bạn và của tôi trong cả triển khai MarkLogic và Zorba Xquery / Xpath.

Cả hai nên làm việc.

/node/child::text()[1] - should return Text1
/node/child::text()[2] - should return text2


/node/text()[1] - should return Text1
/node/text()[2] - should return text2
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.