2014-11-11 3 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"}}} 

또한 드와 그것을 시도 잘못 "기본"JSON json:transform-to-json($XML)을 설정하지만

그것은 단지 "전체"모드에서 작동
XML Element not in expected namespace [http://marklogic.com/xdmp/json/basic] (json:INVALIDELEM): Carousel 

같은 오류를 얻었으나, 내 출력 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) 

원하는 경우 속성을 억제 할 수도 있습니다. 는 config 옵션의 모든 종류를 지원, 나는 그것의 문서를 보는 것이 좋습니다

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

HTH를! 여기

+0

감사합니다. 완벽하게 작동합니다. –

+0

'array-element-names'의 모든 요소를 ​​언급하지 않고 모든 반복 요소를 JSON의 배열로 표시 할 수 있습니까? 내 경우처럼 200 개가 넘는 요소가 있으며 요소는 두 번 이상 발생할 수 있습니다. –

+0

이 json 라이브러리가 없다면 ... – grtjn

1

워드 프로세서 http://docs.marklogic.com/json/json

개념을 통해 이동하지만 종종이 전략의 fundimental 차이는, 그들은 서로 다른 사용 사례에 대한 설계되어 있음을 놓쳤다.

기본 ("기본") 전략은 임의의 JSON을 가져 와서 '블랙 박스'XML로 변환하고 100 % 충실도로 되돌리기 위해 특별히 고안되었습니다.

"전체"전략은 임의의 XML을 가져 와서 '블랙 박스'JSON 형식으로 변환 한 후 다시 신뢰할 수있는 충실도로 반환합니다 (일부 XML 기능은 프로세스에서 손실됩니다).

어느 이들

대상 형식 임의 제어 (또는 관심) 를 갖는 대상으로 그들은 타겟 포맷으로 변경 의도 (또는 작업)되지 않는다.

원본 및 대상 형식을 모두 제어하려는 경우 "사용자 지정"전략 은 변환을 '사용자 지정'방식으로 제어하도록 설계되었습니다. 결과적으로 JSON과 XML 형식을 훨씬 더 효율적으로 제어 할 수 있습니다. 반면에 "좋은"결과를 한 형식으로 생성하는 데 필요한 단순화는 항상 그렇지 않은 스키마 또는 데이터에 대한 가정을 필요로합니다.구성 매개 변수는 이것을 제어하는 ​​데 도움이되지만 이지만 궁극적으로 XML 및 JSON 데이터 모델의 불일치로 인해 은 문서 A와 문서 B에 완벽한 변환을 생성 할 수 없으므로 그것을 코딩하는 것이 좋습니다. "커스텀"변환은 커먼 패턴의 커다란 세트를 쉽게 만족시키려는 절충안이라고 생각하지만, 정확히 원하는 것이 아닐 수도 있습니다. 요구 사항을 좀 더 유연하게 (XML 또는 JSON 형식) 또는 사전 또는 사후 프로세스 단계를 추가하여 사용자 정의 형식에서 처리 할 수있는 형식에 가까운 형식으로 데이터를 변환함으로써 범위를 확장 할 수 있습니다.