MarkLogic: XQuery для получения значений из XML-документов?

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

<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? Я новичок в этом.


person happybayes    schedule 08.04.2016    source источник
comment
Обратите внимание, что разные предметы (книги) обычно должны находиться в отдельных документах. Если у вас есть документ с корнем книги и множеством элементов книги под ним, возможности поиска и индексирования также не будут работать. Было бы полезно прочитать рекомендации MarkLogic по моделированию данных.   -  person Dave Cassel    schedule 12.04.2016


Ответы (2)


Конструкция последовательности 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(), ' | ')
person wst    schedule 11.04.2016
comment
Пожалуйста, найдите мой ответ. Но я получаю значения подряд, задаваясь вопросом, могу ли я их объединить. Я не мог понять, как работает соединение строк. Можете ли вы помочь мне изменить код, чтобы исправить это. - person happybayes; 11.04.2016
comment
В вашем вопросе не указано, как вы выбрали этот образец XML, поэтому я просто использовал $books в качестве заполнителя. Вам нужно будет обновить это, чтобы отразить, как оно хранится в вашей базе данных. Из вашего комментария мне также неясно, что вы подразумеваете под присоединением. - person wst; 11.04.2016
comment
Ответ @wst работает в MarkLogic, если $books настроен правильно. В частности, это должно быть что-то вроде declare variable $books := fn:doc("bookstore.xml")/bookstore - person Dave Cassel; 13.04.2016

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

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