Bắt thuộc tính bằng XPath


344

Đưa ra một cấu trúc XML như vậy:

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>

<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>

</bookstore>

Làm thế nào tôi có thể nhận được giá trị của lang(nơi langeng trong tiêu đề cuốn sách), cho các phần tử đầu tiên?


2
liên kết rất tốt khi sử dụng xpaths test-able.blogspot.ie/2016/04/xpath-selector-cheat-sheet.html

Câu trả lời:


472

Làm thế nào tôi có thể nhận được giá trị của lang (trong đó lang = eng trong tiêu đề sách), cho phần tử đầu tiên?

Sử dụng :

/*/book[1]/title/@lang

Điều này có nghĩa là :

Chọn langthuộc tính của phần tử tiêu đề là con của phần tử con đầu tiên bookcủa phần tử trên cùng của tài liệu XML.

Để chỉ lấy giá trị chuỗi của thuộc tính này, hãy sử dụng hàm XPath tiêu chuẩnstring() :

string(/*/book[1]/title/@lang)

3
@AbhishekAsthana, Kết quả của việc đánh giá biểu thức XPath tạo ra chính xác giá trị chuỗi của langthuộc tính. Nếu thuộc tính không chứa bất kỳ dấu ngoặc vuông nào, chúng sẽ không phải là một phần của kết quả đánh giá biểu thức XPath. Tôi đoán là những thứ này được thêm vào bởi một công cụ (không phù hợp) mà bạn đang sử dụng.
Dimitre Novatchev

6
vâng tôi đã tìm ra vấn đề .. đó chỉ là cách xà phòng hiển thị nó nhưng những dấu ngoặc đó không được sử dụng khi tôi sử dụng giá trị xpath. Tôi đã thấy điều này rất nhiều thời gian. Vấn đề không nằm ở công cụ..its giữa ghế và bàn phím.
Abhishek Asthana

4
@KorayTugay, biểu thức XPath /*/book[1]/title/@lang chọn tập hợp nút gồm 0 hoặc nhiều nút thuộc tính, trong khi biểu thức XPath string(/*/book[1]/title/@lang)khi được ước tính, tạo ra giá trị chuỗi của tập hợp nút này - và đây là giá trị chuỗi của đầu tiên (theo thứ tự tài liệu) nút từ tập hợp nút này.
Dimitre Novatchev

4
@KorayTugay, Không, biểu thức đầu tiên chọn , không "trả lại" - một tập hợp các nút và tập hợp các nút này không phải là một chuỗi. Một nút không phải là một chuỗi - một nút là một nút trong cây . Một tài liệu XML là một cây các nút. lang="eng"chỉ là một trong nhiều biểu diễn văn bản của một nút thuộc tính có tên "lang", không thuộc về một không gian tên và có giá trị chuỗi là chuỗi "eng"
Dimitre Novatchev

1
@Vladimir, Nếu v tương ứng với một không gian tên nói: "my: vvv", thì người ta có thể tạo trong máy chủ của công cụ XPath đang sử dụng ánh xạ liên kết myPrefix (có thể là v nhưng không cần thiết) cho cùng một không gian tên -uri "của tôi: vvv". Và sau đó thuộc tính sẽ được chọn bằng cách sử dụng: title / @ myPrefix: lang. Làm thế nào một ánh xạ như vậy được tạo ra là cụ thể cho việc triển khai và người ta phải đọc trong tài liệu của máy chủ XPath. Điều này được thực hiện theo một cách cụ thể trong .NET và theo một cách khác trong giả sử bằng tiếng Saxon. Nếu bạn không có bất kỳ ánh xạ nào như vậy, hãy sử dụng: title / @ * [name () = 'v: lang']
Dimitre Novatchev

47

Cảm ơn! Điều này đã giải quyết một vấn đề tương tự tôi gặp phải với thuộc tính dữ liệu bên trong Div.

<div id="prop_sample" data-want="data I want">data I do not want</div>

Sử dụng xpath này: //*[@id="prop_sample"]/@data-want

Hy vọng điều này sẽ giúp người khác!


6

Bạn có thể thử bên dưới mẫu xPath,

  XPathExpression expr = xPath.compile("/bookstore/book/title[@lang='eng']")

5
Điều đó sẽ chọn bất kỳ phần tử tiêu đề XML nào dưới / bookstore / book có thuộc tính lang với giá trị eng, KHÔNG phải giá trị của lang. tức là nó chọn một danh sách các thành phần, không phải là một Thuộc tính duy nhất
JFK

2

Bạn cũng có thể lấy nó bằng cách

string(//bookstore/book[1]/title/@lang)    
string(//bookstore/book[2]/title/@lang)

mặc dù nếu bạn đang sử dụng XMLDOM với JavaScript, bạn có thể viết mã như

var n1 = uXmlDoc.selectSingleNode("//bookstore/book[1]/title/@lang");

n1.textsẽ cho bạn giá trị"eng"


2

bạn có thể dùng:

(//@lang)[1]

điều này có nghĩa là bạn nhận được tất cả các nút thuộc tính có tên bằng "lang" và nhận được nút đầu tiên.


0

Đây là đoạn trích nhận giá trị thuộc tính của "lang" với XPath và VTD-XML.

import com.ximpleware.*;
public class getAttrVal {
    public static void main(String s[]) throws VTDException{
        VTDGen vg = new VTDGen();
        if (!vg.parseFile("input.xml", false)){
            return ;
        }
        VTDNav vn = vg.getNav();
        AutoPilot ap = new AutoPilot(vn);
        ap.selectXPath("/bookstore/book/title/@lang");
        System.out.println(" lang's value is ===>"+ap.evalXPathToString());
    }
}

0

Nếu bạn đang sử dụng PostgreSQL, đây là cách phù hợp để có được nó. Đây chỉ là một giả định khi bạn có một bảng sách TITLE và cột GIÁ với dữ liệu được điền. Đây là truy vấn

SELECT xpath('/bookstore/book/title/@lang', xmlforest(book.title AS title, book.price AS price), ARRAY[ARRAY[]::TEXT[]]) FROM book LIMIT 1;
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.