1

我正在研究 eXist 数据库,我有一个新想法,我必须使用XQuery实现 XML 文件。

我想将 CSV 文件转换为已经在数据库集合中的 XML。而这个 XML 文件只包含必要的标签和信息。并且这些转换后的数据将被保存到 eXist 数据库中的 XML 中。

像这样的 XML:它的名字是 'createXML.xml'

<?xml version="1.0" encoding="UTF-8"?>
<records>
// All the Records from CSV file want to put here..... between Records tags
</records>

现在 CSV 文件是这样的:

name,subject,marks    //header lines
krunal,maths,95
abc,sub1,87
def,sub2,67
...

像这样输出

<?xml version="1.0" encoding="UTF-8"?>
<records>
   <user>
       <name>krunal</name>
       <subject>maths</subject>
       <marks>95</marks>
   </user>
   <user>
       <name>abc</name>
       <subject>sub1</subject>
       <marks>87</marks>
   </user>
   <user>
       <name>def</name>
       <subject>sub2</subject>
       <marks>67</marks>
   </user>
      .
      .
      .
</records>

谁能告诉我如何在 eXist 数据库中使用 XQuery 将 CSV 数据添加到已经可用的 XML 并执行此功能。

4

2 回答 2

1

要阅读文件,请查看您的 XQuery 实现文档,此处阅读 eXist 的文件

Wikibooks 有一个关于如何解析 CSV 的优秀示例:

let $csv := 'name,faculty
alice,anthropology
bob,biology'

let $lines := tokenize($csv, '\n')
let $head := tokenize($lines[1], ',')
let $body := remove($lines, 1)
return
    <people>
        {
            for $line in $body
            let $fields := tokenize($line, ',')
            return
                <person>
                    {
                        for $key at $pos in $head
                        let $value := $fields[$pos]
                        return
                            element { $key } { $value }
                    }
                </person>
        }
    </people>

另一种可能性是使用另一个具有内置 csv 导入支持的 XQuery 引擎,例如ZorbaBaseX

于 2012-04-12T07:15:00.740 回答
0

假设 (1) 您的 CSV 文件已经在数据库中,并且 (2) 您希望将 CSV-to-XML 的结果存储在一个新的 XML 文件中,那么您的 XQuery 有 3 个部分:

  1. 使用util:binary-doc()util:binary-to-string()获取 CSV 文件的内容。请注意, util:binary-to-string() 假定文件使用 UTF-8 编码,但如文档所示,如果 CSV 文件具有非 UTF-8 编码,您可以告诉函数编码方案。
  2. 使用有关解析 CSV的 XQuery Wikibook 文章(已在 @Ranon 的回复中提到)将 CSV 转换为所需的结构。我假设您知道足够多的 XQuery 以将此例程改编为您自己的函数 — 我将在下面将其称为 local:csv-to-xml()。
  3. 使用xmldb:store()函数将生成的 XML 存储在数据库中

(请注意,util 和 xmldb 模块是 eXist-db 特定的模块,因为 XQuery 规范没有涵盖此功能。如果您使用不同的 XQuery 实现,则需要使用它们的特定于实现的方法。)

所以这里是 eXist-db 解决方案:

let $csv-file := '/db/myCSV.csv'
let $csv-binary := util:binary-doc($csv-file)
let $csv := util:binary-to-string($csv-binary)
let $xml := local:csv-to-xml($csv)
return
    xmldb:store('/db', 'createXML.xml', $xml)

这会将 myCSV.csv 的转换版本作为 createXML.xml 存储在 eXist 数据库的根目录:/db/createXML.xml。

相反,如果您想将 XML 结果附加到现有的 XML 文件中,您将需要应用 XQuery Update 语法——它允许您在存储在数据库中的文档中插入节点、替换节点和删除节点。在 eXist-db 中,eXist 的 XQuery 更新语法的文档位于http://exist-db.org/exist/update_ext.xml

于 2012-04-12T20:58:51.137 回答