【问题标题】:MarkLogic: XQuery to Get Values from XML Documents?MarkLogic:XQuery 从 XML 文档中获取值?
【发布时间】:2016-04-08 23:38:59
【问题描述】:

我在 MarkLogic 数据库中加载了以下 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 的新手。当我从 SQL 数据库中检索 XML 文档中的值时,我将如何检索它?

输出:

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 吗?我是新手。

【问题讨论】:

  • 请注意,不同的项目(书籍)通常应位于不同的文档中。如果您有一个带有书根的文档,并且其下有很多书本元素,则搜索和索引功能将无法正常工作。 MarkLogic data modeling guidelines 将是有用的阅读。

标签: xml xsd xquery marklogic xquery-sql


【解决方案1】:

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(), ' | ')

【讨论】:

  • 请找到我的答案。但是我连续获得了值,想知道我可以加入它。我无法理解字符串连接的工作原理。你能帮我修改代码来解决这个问题吗?
  • 您的问题没有说明您是如何选择该 XML 样本的,所以我只是使用 $books 作为占位符。您需要更新它以反映它在数据库中的存储方式。从您的评论中我也不清楚您所说的加入是什么意思。
  • 如果 $books 设置正确,@wst 的答案在 MarkLogic 中有效。具体来说,它应该类似于declare variable $books := fn:doc("bookstore.xml")/bookstore
【解决方案2】:

@wst:非常感谢。出于某种原因,我无法在 marklogic 中运行相同的程序。可能它适用于通用 XML Xquery。但我找到了以下解决方案

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 2018-11-18
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    相关资源
    最近更新 更多