2014-11-11 7 views
3

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

XML

<Carousel> 
    <Video> 
    <Title>1</Title> 
    <Abstract>3</Abstract> 
    <FileName type="custom" mediatype="image">D</FileName> 
    <HasAccess>4</HasAccess> 
    </Video> 
    <Video> 
    <Title>1</Title> 
    <Abstract>2</Abstract> 
    <FileName type="custom" mediatype="image">D</FileName> 
    <HasAccess>3</HasAccess> 
    </Video> 
</Carousel> 

XQUERY:

import module namespace json = "http://marklogic.com/xdmp/json" at "/MarkLogic/json/json.xqy"; 

let $custom := let $config := json:config("custom") 
      return 
      (
       map:put($config, "whitespace", "ignore"), 

       $config 
      ) 
let $XML := $XMLFile (: XML content :) 
return json:transform-to-json($XML,$custom) 

Текущий ВЫВОД:

{"Carousel":{"Video":{"Title":"1", "Abstract":"2", "FileName":{"type":"custom", "mediatype":"image", "_value":"D"}, "HasAccess":"3"}}} 

Я также пробовал с де неисправности установки «Basic» JSON json:transform-to-json($XML) но получил ошибку как

XML Element not in expected namespace [http://marklogic.com/xdmp/json/basic] (json:INVALIDELEM): Carousel 

Он работает в режиме «Full» только, но это добавляет некоторую дополнительную информацию в формате JSON, как _attribute и т.д., которые не требуется в моем выходе JSON.

Пожалуйста, помогите мне или дайте понять, почему он не возвращает полный выход в формате JSON.

ответ

5

Вам нужно будет отметить повторяющиеся элементы как элементы массива для стартеров. Это, как представляется, работает:

xquery version "1.0-ml"; 

import module namespace json = "http://marklogic.com/xdmp/json" at "/MarkLogic/json/json.xqy"; 

let $xml := <Carousel> 
    <Video> 
    <Title>1</Title> 
    <Abstract>3</Abstract> 
    <FileName type="custom" mediatype="image">D</FileName> 
    <HasAccess>4</HasAccess> 
    </Video> 
    <Video> 
    <Title>1</Title> 
    <Abstract>2</Abstract> 
    <FileName type="custom" mediatype="image">D</FileName> 
    <HasAccess>3</HasAccess> 
    </Video> 
</Carousel> 

let $custom := 
    let $config := json:config("custom") 
    let $_ := map:put($config, "whitespace", "ignore") 
    let $_ := map:put($config, "array-element-names", "Video") 
    return $config 

return json:transform-to-json($xml,$custom) 

Возможно, вы также можете подавить атрибуты, если хотите. Конфигурации поддерживает все виды вариантов, я рекомендую смотреть на его документации:

http://docs.marklogic.com/json:config

HTH!

+0

Спасибо, что работает отлично. –

+0

Можно ли пометить все повторяющиеся элементы как массивы в JSON без упоминания всех элементов в 'array-element-names'. Как и в моем случае, будет более 200 элементов, и любой из элементов может произойти более одного раза. –

+0

Не с этой json-библиотекой, я боюсь .. – grtjn

1

Документах здесь http://docs.marklogic.com/json/json

Go над концепцией, но ее часто упускают, что есть fundimental разница в стратегиях, они предназначены для различных случаев применения.

Стратегия по умолчанию («базовая») разработана специально для того, чтобы принимать произвольные JSON и конвертировать в «черный ящик» XML и обратно со 100% точностью.

«Полная» стратегия деконструирована для обратного, для получения произвольного XML и преобразования в формат «черного ящика» JSON и обратно с точностью до резонансной точности (некоторые функции XML теряются в процессе).

Ни один из них предназначен для имеющих любого управления (или беспокойство) для целевого формата, и они не предназначены (или работы) с любыми изменениями в целевом формате.

Где вы хотите контролировать как исходные, так и целевые форматы, «настраиваемая» стратегия предназначена для управления преобразованием «обычным» способом. В результате у вас гораздо больше контроля над форматами JSON и XML, с другой стороны, упрощения, необходимые для получения «хороших» результатов в том или ином формате, требуют предположений о схеме или данных, которые не всегда верны.Параметры конфигурации помогают контролировать это, , но в конечном итоге из-за несоответствия моделей данных XML и JSON вообще невозможно быть , способным создать преобразование, идеально подходящее для Документов A и Документа B, без сложной конфигурации, Лучше бы его не перекодировали. Итак, рассмотрите «обычное» преобразование - компромисс, предназначенный для удовлетворения большого набора общих шаблонов, но может быть не совсем то, что вы хотите. Вы можете расширить диапазон, будь то немного более гибкими в своих требованиях (форматы XML или JSON) или добавив шаг pre или post processng для преобразования ваших данных в формат, близкий к тому, который может обрабатывать пользовательский формат.

Смежные вопросы