Как добавить данные CSV в уже доступный XML с помощью файла XQuery, используемого в базе данных eXist

Я работаю над базой данных eXist, у меня есть новая идея реализовать XML-файл с помощью XQuery.

Я хочу преобразовать CSV-файл в XML, который уже находится в базе данных. И этот файл XML содержит только необходимые теги и информацию. И эти преобразованные данные будут сохранены в формате XML в базе данных eXist.

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>

Может ли кто-нибудь предоставить мне как добавить данные CSV в уже доступный XML с помощью XQuery в базе данных eXist и выполнить эту функцию.


person krunal    schedule 12.04.2012    source источник
comment
Пожалуйста, не делайте разметку кода вручную, используйте для этого возможности Markdown. И немного сэкономьте на криках, это усложнит чтение вашего вопроса. На ваш вопрос: я предполагаю, что комментарий не появится в файле csv, так как это не обычная практика (и в любом случае он будет принадлежать последнему полю заголовка).   -  person Jens Erat    schedule 12.04.2012


Ответы (2)


Чтобы прочитать файл, посмотрите документацию по реализации XQuery, здесь чтение файла для eXist.

В Викиучебнике есть отличный пример анализа 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>

Другая возможность — использовать другой движок XQuery со встроенной поддержкой импорта csv, например Zorba или BaseX.

person Jens Erat    schedule 12.04.2012
comment
Функция file:read() используется для чтения файлов из файловой системы, а не из базы данных. В исходном вопросе говорилось, что файл CSV уже хранится в базе данных. Если бы файл был XML, вы могли бы просто использовать doc(). Но поскольку CSV-файл не является XML, eXist рассматривает его как двоичный; и, таким образом, используемая функция — util:binary-doc() . - person Joe Wicentowski; 13.04.2012

Предполагая, что (1) ваш CSV-файл уже находится в базе данных и (2) вы хотите сохранить результат преобразования CSV-to-XML в новый XML-файл, тогда ваш XQuery состоит из 3 частей:

  1. Получите содержимое CSV-файла, используя util:binary-doc(). и util:binary-to-string(). Обратите внимание, что util:binary-to-string() предполагает, что файл закодирован с помощью UTF-8, но, как показывает документация, вы можете сообщить функции схему кодирования, если ваш файл CSV имеет кодировку, отличную от UTF-8.
  2. Преобразуйте CSV в желаемую структуру, используя статью XQuery Wikibook об разборе CSV (уже упоминалось в ответе @Ranon). Я предполагаю, что вы достаточно знаете XQuery, чтобы адаптировать эту подпрограмму в своей собственной функции, которую я ниже назову local:csv-to-xml().
  3. Сохраните полученный XML в базе данных, используя функцию xmldb:store().

(Обратите внимание, что модуль 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, который позволяет вставлять узлы, заменять узлы и удалять узлы в документах, хранящихся в базе данных. В eXist-db документация по синтаксису eXist XQuery Update находится по адресу http://exist-db.org/exist/update_ext.xml.

person Joe Wicentowski    schedule 12.04.2012