2016-04-08 2 views
3

У меня есть следующий XML-документ загружен в базу данных MarkLogic:MarkLogic: XQuery получает значения из XML-документов?

<x:books xmlns:x="urn:books"> 
    <book id="bk001"> 
    <author>Writer</author> 
    <title>The First Book</title> 
    <genre>Fiction</genre> 
    <price>44.95</price> 
    <pub_date>2000-10-01</pub_date> 
    <review>An amazing story of nothing.</review> 
    </book> 
    <book id="bk002"> 
    <author>Poet</author> 
    <title>The Poet's First Poem</title> 
    <genre>Poem</genre> 
    <price>24.95</price> 
    <review>Least poetic poems.</review> 
    </book> 
</x:books> 

Я новичок в XQuery. Как я могу получить значения из документа XML при получении из базы данных SQL?

Выход:

BookID | Author | Title | Genre | price | pub_date | review 
bk001 | Writer | The First Book | Fiction | 44.95 | 2000-10-01 
bk002 | Poet | The Poet's First Poem | Poem | 24.95 | Least poetic poems. 

Примечание: Не требуется труба разграничены, но некоторый список коллекции.

Может ли кто-нибудь поделиться ссылкой или помочь мне написать этот XQuery? Я новичок в этом.

+0

Обратите внимание, что разные предметы (книги) обычно должны быть в отдельных документах. Если у вас есть документ с корнем книг и множество элементов книги под ним, возможности поиска и индексирования не будут работать. [Руководство по моделированию данных MarkLogic] (http://developer.marklogic.com/learn/data-modeling) было бы полезным для чтения. –

ответ

4

Строка последовательности XQuery будет содержать несколько значений, но она не является иерархической - поэтому, если вы создаете последовательность последовательностей, она просто объединяет их все вместе в одну большую последовательность.

Это приведет к захвату всех дочерних элементов и значений атрибутов в последовательность, но из-за свойства последовательностей, о которых я только что упомянул, не было бы встроенного способа получить первое значение второй книги. Вы должны знать, что это 7-й предмет. И что первое значение третьей книги будет 14-й пункт, и так далее:

$books/book/(*|@*)/string() 

Просто, чтобы продемонстрировать, как вы бы достичь трубы разделителей списка:

string-join($books/book[1]/(*|@*)/node-name() ! string(), ' | '), (: Create header row :) 
for $book in $books/book 
return string-join($book/(*|@*)/string(), ' | ') 
+0

, пожалуйста, найдите мой ответ. Но я получаю значения в строке, задаваясь вопросом, как я могу подключить его. Я не мог понять, как работает string-join. Можете ли вы помочь мне изменить код, чтобы исправить это. – happybayes

+0

В вашем вопросе не указано, как вы выбрали этот образец XML, поэтому я просто использовал '$ books' в качестве заполнителя. Вам нужно будет обновить это, чтобы отразить, как он хранится в вашей базе данных. Мне также непонятно, из вашего комментария, что вы подразумеваете под соединением. – wst

+1

@ Ответ wst работает в MarkLogic, если правильно заданы книги $ books. В частности, это должно быть что-то вроде 'declare variable $ books: = fn: doc (" bookstore.xml ")/bookstore' –

1

@wst: Спасибо так много. По какой-то причине я не смог запустить то же самое в marklogic. Может быть, он работает для универсального XML Xquery. Но я нашел следующее решение:

for $x at $i in doc("bookstore.xml")/bookstore/book 
return data($x)