XML в JSON: как восстановить порядок узлов после преобразования в JSON - PullRequest
1 голос
/ 09 ноября 2019

В настоящее время я работаю с eXist-db в качестве базы данных XML / TEI и Angular для создания веб-сайта. Код Angular запрашивает данные у eXist-db, и я решил заставить eXist-db отвечать JSON. Я предполагал, что JSON является наиболее подходящим форматом данных для этой задачи.

Я использую следующий код XQuery для создания JSON из фиксированного файла XML (в настоящее время я только начинаю / тестирую все это) вeXist-db:

xquery version "3.0";
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare option output:method "json";
declare option output:media-type "application/json";
let $doc := doc("/db/data/Drucktexte/playground/Test_Angular_ngFor.xml")
return
   <result>{$doc}</result>

Моя проблема: в XML есть, например,

узлы, которые в основном содержат текст. И могут быть другие подузлы, встроенные в это текстовое содержимое узла

. В XML порядок текста и других узлов является последовательным и, следовательно, понятным.

Ниже показан некоторый XML с двумя

узлами. Единственное различие между этими двумя

узлами заключается в порядке их подузлов - например, появление :

<TEI>
<p n="1">The first text fragment
    <app>The first app fragment</app>
    The second text fragment
    <app>The second app fragment</app>
    The third text fragment
    <pagebreak/>
    The fourth text fragment
    <app>The third app fragment</app>
</p>
<p n="2">The first text fragment
    <app>The first app fragment</app>
    The second text fragment
    <pagebreak/>
    The third text fragment
    <app>The second app fragment</app>
    The fourth text fragment
    <app>The third app fragment</app>
</p>

Когда XML преобразуется в JSON,Я получаю изолированные массивы одинаковых типов узлов. В настоящее время я не вижу, как я могу восстановить правильный порядок этих элементов массива, чтобы отобразить все эти элементы / узлы на веб-сайте в правильном порядке. После преобразования верхнего XML в JSON оба узла

выглядят одинаково:

[
 {
  "@n": "1",
  "#text": [
     "The first text fragment",
     "The second text fragment",
     "The third text fragment",
     "The fourth text fragment"
  ],
  "app": [
     "The first app fragment",
     "The second app fragment",
     "The third app fragment"
  ],
  "pagebreak": []
},
{
  "@n": "2",
  "#text": [
     "The first text fragment",
     "The second text fragment",
     "The third text fragment",
     "The fourth text fragment"
  ],
  "app": [
     "The first app fragment",
     "The second app fragment",
     "The third app fragment"
  ],
  "pagebreak": []
}]

В настоящее время я не могу определить, после какого фрагмента текста должен быть вставлен узел разрыва страницыкаждый

. Я провел некоторое исследование по этой проблеме XML в JSON, но не смог найти ничего полезного. С другой стороны, я не могу себе представить, что я первый, кто столкнулся с такой проблемой.

Я думал о добавлении некоторых данных в JSON, которые представляют структуру всех узлов и подузлов, но я думаю, что тамдолжно быть более элегантным способом.

Так что любая помощь приветствуется. Заранее большое спасибо.

1 Ответ

1 голос
/ 12 ноября 2019

В вашем коде используется несколько специфичный для eXist метод преобразования произвольного XML в узлы JSON, описанный здесь: https://exist -db.org / exist / apps / wiki / blogs / eXist / JSONSerializer . (eXist не единственный среди реализаций XQuery, который разработал средство для генерации JSON до того, как рабочая группа XQuery добавила полную поддержку JSON в XQuery 3.1.) Хотя это преобразование хорошо работает, оно может быть не совсем тем, что вам нужно для использования. кейс.

К счастью, eXist поддерживает стандартные встроенные возможности XQuery 3.1 для анализа и сериализации JSON . Это означает, что вы можете написать XQuery, который генерирует JSON, который сохраняет порядок ваших узлов и выполняет любое другое пользовательское поведение в процессе.

Два примера преобразований XML-в-JSON, которые сохраняют порядок узлов, см. В:

  1. Полностью настраиваемое, хотя и подробное преобразование вашего XML в JSON: https://xqueryfiddle.liberty -development.net / pPgCcoF
  2. Более компактное преобразование вашего XML в JsonML: https://xqueryfiddle.liberty -development.net / bdxtpA .
...