2016-04-08 10 views
3

Ich habe das folgende XML-Dokument geladen in Marklogic-Datenbank:MarkLogic: XQuery zum Abrufen von Werten aus XML-Dokumenten?

<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> 

Ich bin neu in XQuery. Wie würde ich die Werte aus dem XML-Dokument abrufen, wenn ich sie aus einer SQL-Datenbank abrufe?

Ausgang:

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. 

Hinweis: Nicht ein Rohr notwendig begrenzt, aber einige Sammellisten.

Kann jemand einen Link teilen oder mir helfen, diese XQuery zu schreiben? Ich bin neu in diesem Bereich.

+0

Beachten Sie, dass verschiedene Elemente (Bücher) in der Regel in separaten Dokumenten sein sollten. Wenn Sie ein Dokument mit einem Bücherstamm und vielen Buchelementen darunter haben, funktionieren die Such- und Indizierungsfunktionen nicht so gut. [MarkLogic-Datenmodellierungsrichtlinien] (http://developer.marklogic.com/learn/data-modeling) wäre hilfreich beim Lesen. –

Antwort

4

Das Sequenzkonstrukt von XQuery enthält mehrere Werte, es ist jedoch nicht hierarchisch. Wenn Sie also eine Sequenz von Sequenzen erstellen, werden diese einfach alle zu einer großen Sequenz zusammengefasst.

Dadurch werden alle untergeordneten Element- und Attributwerte in einer Sequenz erfasst, aber aufgrund der Eigenschaft der Sequenzen, die ich gerade erwähnt habe, würde es keine eingebaute Möglichkeit geben, den ersten Wert des zweiten Buches zu erhalten. Du müsstest wissen, dass es der siebte Gegenstand ist. Und dass der erste Wert eines dritten Buch der 14. Punkt sein würde, und so weiter:

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

Nur um zu zeigen, wie Sie ein Rohr getrennte Liste erreichen würden:

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

finden Sie meine Antwort. Aber ich bekomme die Werte in einer Reihe und frage mich, ob ich es verbinden kann. Ich konnte nicht verstehen, wie der String-Join funktioniert. Können Sie mir helfen, den Code zu ändern, um das zu beheben? – happybayes

+0

Ihre Frage hat nicht angegeben, wie Sie das XML-Beispiel ausgewählt haben, also habe ich '$ books' als Platzhalter verwendet. Sie müssten das aktualisieren, um zu reflektieren, wie es in Ihrer Datenbank gespeichert ist. Es ist mir auch nicht klar aus deinem Kommentar, was du mitmachen willst. – wst

+1

@ wst's Antwort funktioniert in MarkLogic, wenn $ books korrekt eingerichtet ist. Insbesondere sollte es so etwas wie 'declare variable $ books: = fn: doc (" bookstore.xml ")/bookstore' sein –

1

@wst: Danke so sehr. Aus irgendeinem Grund konnte ich das nicht in marklogic ausführen. Möglicherweise funktioniert es für generische XML Xquery. Aber ich fand die folgende Lösung

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