2017-02-09 1 views
2

XML에 액세스 할 때 사용하는 것과 동일한 기술을 사용하여 일부 JSON을 XPath로 변환하려고합니다. 아래는 동일한 XPath가 적용된 2 개의 동등한 구조입니다.XML과 다른 JSON 용 xpath

let $json := xdmp:unquote('{ 
    "foo": { 
    "bar": { 
     "bas": "findme", 
     "boo": "324" 
    } 
    } 
}') 

let $xml := <xml> 
    <foo> 
    <bar> 
     <bas>findme</bas> 
     <boo>324</boo> 
    </bar> 
    </foo> 
</xml> 

return (
    $xml//node()[./text() = "findme"], 
    $json//node()[./text() = "findme"] 
) 

나는 모두 같은 결과를 기대하지만 난 다음 얻을 :

XML 결과

<bas>findme</bas>

JSON 결과

{ "bas": "findme", "boo": "324" }

왜 같은 결과가 나오지 않습니까?

+0

XML 구조와 JSON 구조가 동일하지 않습니다. 이 XML이 더 가까운 지 궁금합니다. (분명히 동일한 XPath가 작동하지 않지만) : '. 어쨌든 grtjn의 대답이 더 도움이됩니다. –

+0

$ json // bas는 작동하지만 $ json // @ bas가 아니기 때문에 더 가까이 있다고 생각하지 않습니다. – chriskelly

답변

3

MarkLogic에서 텍스트 속성 bas은 XML 텍스트 공간에 존재하지 않는 이름있는 텍스트 노드입니다. //bas과 같은 것이 양쪽 모두에서 작동하도록 설계되었습니다. 때문에 명명 된 텍스트 노드의 트리 구조는 가장 깊은 수준에서 다른 :

element bas { 
    text { "findme" } 
}, 
element boo { 
    text { "324" } 
} 

대 :

object-node { 
    text bas { "findme" }, 
    text boo { "324" } 
} 

참고 : 후자는 의사 코드입니다. JSON 생성자의 올바른 사용은 object-node { "bas": "findme", "boo": "324" }입니다.

fn:name() (fn:local-name()은 여기에서 작동하지 않습니다.)을 사용하면 더 가까운 곳으로 갈 수 있습니다. 다음과 같이 시도하십시오.

let $json := xdmp:unquote('{ 
    "foo": { 
    "bar": { 
     "bas": "findme", 
     "boo": "324" 
    } 
    } 
}') 

let $xml := <xml> 
    <foo> 
    <bar> 
     <bas>findme</bas> 
     <boo>324</boo> 
    </bar> 
    </foo> 
</xml> 

let $xml-text := $xml//text()[. = "findme"] 
let $json-text := $json//text()[. = "findme"] 
for $t in ($xml-text, $json-text) 
return 
    if (name($t) eq "") then 
    $t/.. 
    else 
    object-node { name($t): $t } 

HTH!