2015-04-20 40 views
0

我錯過了一些東西,但不知道是什麼。我使用BaseX和Http服務器將REST GET放在我已經在一個數據中存儲的XML中,如下所示。使用Xquery檢索XML中的子節點選擇

<?xml version="1.0" encoding="utf-8"?> 
<CarParkDataImport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.transportdirect.info/carparking B:/CODE/carparks/CarParking.xsd" xmlns="http://www.transportdirect.info/carparking"> 
<CarPark> 
    <CarParkRef>3</CarParkRef> 
    <CarParkName>Nunnery Lane</CarParkName> 
    <Location>York</Location> 
    <Address>Nunnery Lane--York--North Yorkshire</Address> 
    <Postcode>YO23 1AA</Postcode> 
    <Notes>Open 24 hours. Park and pay by phone in this car park by calling 01904 279279. The location number for this car park is 7709. Blue badge holders can park free for as long as they want. CCTV &amp; toilets. Permit parking available.</Notes> 
    <Telephone>01904551309</Telephone> 
    <URL>http://www.york.gov.uk/transport/Parking/Car_parks/nunnery_ln/</URL> 
</CarPark> 
</CarParkDataImport> 

現在我有2個XQuery查詢我已經存儲在HTTP服務器查詢

(: XQuery file: location.xq :) 
declare default element namespace "http://www.transportdirect.info/carparking"; 
declare variable $a as xs:string external; 
db:open("Car_park_data")/CarParkDataImport/CarPark[Location=$a] 

(: XQuery file: loc.xq :) 
declare default element namespace "http://www.transportdirect.info/carparking"; 
declare variable $a as xs:string external; 
for $b in db:open("Car_park_data")/CarParkDataImport/CarPark 
where $b/Location = $a 
return $b/. 

,所以我可以運行我的REST HTTP像(與.xq根據我所查詢的內容而有所不同

http://localhost:8984/rest?run=loc.xq&$a=York 

這些都似乎工作,並帶回CarPark下的所有節點,但我如何才能帶回選擇的節點?例如CarParkName,Location和Postcode。

回答

1

我該如何帶回選擇的節點?例如CarPark名稱,位置和郵政編碼

然後,不要返回$b中包含的所有內容,而只是其中的一部分。以下查詢僅返回與該位置匹配的停車場的LocationCarParkNamePostcode元素。

該查詢適用於我的本地系統,否則,它與您的相同。

(: XQuery file: loc.xq :) 
declare default element namespace "http://www.transportdirect.info/carparking"; 
let $a := "York" 
for $b in doc("carpark.xml")/CarParkDataImport/CarPark 
where $b/Location = $a 
return $b/(Location | CarParkName | Postcode) 

將返回這三個節點,而不是需要一些空間聲明,但不應該得到的方式無論是。

<?xml version="1.0" encoding="UTF-8"?> 
<CarParkName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns="http://www.transportdirect.info/carparking">Nunnery Lane</CarParkName> 
<Location xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns="http://www.transportdirect.info/carparking">York</Location> 
<Postcode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns="http://www.transportdirect.info/carparking">YO23 1AA</Postcode 

我得到以下錯誤消息。 「第2行誤差在1列:在文檔的末尾附加內容」,它只是顯示一個carparkname,會有一個登錄BaseX,我可以檢查,看看有什麼發生,

我不熟悉BaseX的日誌文件,但問題是響應不是格式良好的XML;它沒有一個單獨的根元素,因爲joemfb已經有幫助地指出了。所以,解決的辦法是包裝在一個根元素要返回的元素:

declare default element namespace "http://www.transportdirect.info/carparking"; 
let $a := "York" 
for $b in doc("carpark.xml")/CarParkDataImport/CarPark 
where $b/Location = $a 
return 
<root> 
{$b/(Location | CarParkName | Postcode)} 
</root> 

和結果:

<?xml version="1.0" encoding="UTF-8"?> 
<root xmlns="http://www.transportdirect.info/carparking"> 
    <CarParkName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Nunnery Lane</CarParkName> 
    <Location xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">York</Location> 
    <Postcode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">YO23 1AA</Postcode> 
</root 
+0

謝謝你,偉大工程。在BaseX中,結果回來了,注意到了,並且帶回了那個位置的所有停車場,但是當我發送REST http時,我收到以下錯誤消息。 '第2行第1列錯誤:文檔末尾有額外內容',它只顯示一個carparkname,是否會有BaseX日誌,我可以查看發生了什麼,因爲我看不到任何內容XML本身? – funkmaster20th

+0

您可能需要將這些元素包裝在根元素中。最簡單的方法是將整個查詢包裝在一個元素構造函數中:'element results {let $ a ....}'。 – joemfb

+0

@ funkmaster20th我編輯了我的答案。 –