2013-09-02 22 views
6

Trong khi làm việc với xpath (mà không được rất dài), tôi đã xem qua một cái gì đó kỳ lạ.Tại sao biểu thức lựa chọn vị trí xpath trả về nhiều nút?

phiên bản rút gọn của xml (The xml đầy đủ là here và một bản chụp có sẵn trên pastebin):

<?xml version="1.0" encoding="utf-8" ?> 
<body copyright="All data copyright San Francisco Muni 2013."> 
    <route tag="all"> 
    <message id="10268" creator="jflynn" startBoundary="1378121400000" startBoundaryStr="Mon, Sep 02 04:30:00 PDT 2013" endBoundary="1378191540000" endBoundaryStr="Mon, Sep 02 23:59:00 PDT 2013" sendToBuses="false"> 
     <text>Sunday schedules today.</text> 
    </message> 
    </route> 
    <route tag="44"> 
    <message id="10221" creator="mlee" startBoundary="1377525600000" startBoundaryStr="Mon, Aug 26 07:00:00 PDT 2013" endBoundary="1382857140000" endBoundaryStr="Sat, Oct 26 23:59:00 PDT 2013" sendToBuses="false"> 
     <routeConfiguredForMessage tag="44">  <stop tag="6420" title="Silver Ave &amp; Revere Ave" /> 
</routeConfiguredForMessage> 
     <text>Stop moved&#10;across Revere&#10;During&#10;Construction</text> 
    </message> 
    <message id="10222" creator="mlee" startBoundary="1377525600000" startBoundaryStr="Mon, Aug 26 07:00:00 PDT 2013" endBoundary="1382857140000" endBoundaryStr="Sat, Oct 26 23:59:00 PDT 2013" sendToBuses="false"> 
     <routeConfiguredForMessage tag="44">  <stop tag="6420" title="Silver Ave &amp; Revere Ave" /> 
</routeConfiguredForMessage> 
     <text>Stop moved&#10;across Revere&#10;During&#10;Construction</text> 
    </message> 
    </route> 
</body> 

Khái niệm

//route[1] 

trả lại route nút đầu tiên như tôi mong đợi. Tuy nhiên, khi cố gắng chọn message nút đầu tiên, với

//message[1] 

nhiều message nút đã được trả lại chứ không phải chỉ là một.

Lúc đầu, tôi cho rằng đó là vấn đề nền tảng, nhưng thử nghiệm trên Android, Desktop Java và một vài người thử nghiệm xpath trực tuyến, tôi cũng nhận được kết quả tương tự.

Điều gì có thể là vấn đề?

+1

Câu hỏi rất hay và cơ bản .. * + 1 * cho cùng một .. –

+0

có thể trùng lặp của [nhận nút đầu tiên trong tập kết quả xpath] (http://stackoverflow.com/questions/9199415/getting-first- node-in-xpath-result-set) –

Trả lời

8

Cả hai biểu thức đại diện cho lần đầu tiên là routemessage con của cha mẹ. Tất cả các bạn route s là anh chị em chia sẻ một phụ huynh body, do đó, người đầu tiên trong số này được trả lại và chỉ điều đó. Tuy nhiên, mỗi route chứa tập hợp riêng của mình là message trẻ em, số đầu tiên trong số đó được trả lại cho mỗi nút route.

Nếu bạn cần phải phù hợp các yếu tố đầu tiên message trong toàn bộ tài liệu XML của bạn, sử dụng:

(//message)[1] 

Dấu ngoặc nói với bộ vi xử lý để tìm các nút phù hợp với //message thì [1] vị mà đến sau khi chọn người đầu tiên ra của các nút đó. Nếu không có chúng, vị từ [1] sẽ hoạt động đơn giản dựa trên con của nút cha của chúng.


Bởi vì tôi là một người nghiện CSS selector: các đối tác chọn cho các biểu thức XPath của bạn là route:nth-of-type(1)message:nth-of-type(1), tương ứng.

+0

Tôi vẫn còn bối rối .. mặc dù bạn đã đúng .. Trong biểu thức 'xpath' như' // message [1] 'chọn phần tử' message', vị trí của nó là đầu tiên .. Nhưng nó là mơ hồ đối với tôi..still .. –

+2

@Babai: Điều gì mơ hồ về "con đầu tiên' route' và 'message' con của cha mẹ"? – BoltClock

+0

@BoltClock Cảm ơn bạn đã trả lời! Nó có ý nghĩa. –

Các vấn đề liên quan