Jan,
If your infrastructure permits sending BaseX's output to an XSLT processor, this will be the most flexible and maintainable solution. (Of course you'll still have to write the XSLT templates, which is straightforward.)
There are many ways to express a given XML document in JSON. I implemented one of them below. But as I said, if you need to adapt it to your needs, it will be more costly to modify or branch this XQuery code than to maintain XSLT code. On the other hand, if no XSLT processor is available or if you need to write glue code, adding this additional piece of infrastructure is often also costly.
test.xq: ----------------- declare function local:jsonify-node ($input as node()?, $indent as xs:integer) as xs:string { if (empty($input)) then '' else if ($input instance of element()) then concat( local:indent($indent - 1), '{', string-join( ( concat(local:indent($indent), '"_name": "', name($input), '"'), local:jsonify-attributes($input/@*, $indent), if ($input/node()) then concat( local:indent($indent), '"_children":', local:indent($indent), "[", string-join(for $n in $input/node() return local:jsonify-node($n, $indent + 2), ', '), local:indent($indent), "]" ) else () ), ',' ), local:indent($indent - 1), '}' ) else concat( local:indent($indent - 1), '{ "_text": ', '"', $input, '" }' ) };
declare function local:jsonify-attributes ($input as attribute()*, $indent as xs:integer) as xs:string? { if ($input) then string-join( for $a in $input return concat( local:indent($indent), '"', name($input), '": "', $input, '"' ), ',' ) else () };
declare function local:indent ($indent as xs:integer) as xs:string { string-join(('
', for $i in (1 to 2 * $indent) return ' ')) };
local:jsonify-node(collection('jsontest')/*, 1) -----------------
test.xml: ----------------- <?xml version="1.0"?> <root> <foo bar="4"> <a>Text <b>text</b></a> </foo> <foo/> </root> -----------------
Then: $ basex -c "create database jsontest; open jsontest; add test.xml" $ basex test.xq
Result: ----------------- { "_name": "root", "_children": [ { "_name": "foo", "bar": "4", "_children": [ { "_name": "a", "_children": [ { "_text": "Text" }, { "_name": "b", "_children": [ { "_text": "text" } ] } ] } ] }, { "_name": "foo" } ] } -----------------
Paste it into, e.g., http://json.parser.online.fr/ It will parse.
-Gerrit
On 26.01.2011 21:43, Michael Seiferle wrote:
Hi Jan, for the moment we do not offer any options to export the resulting file in JSON. However it could easily be added when using our API.
I found https://github.com/douglascrockford/JSON-java
which is a reference implementation according to http://www.json.org/java/ Converting serialized XML to JSON maybe adds another level of indirection but should suit most usecases well.
Hope this helps! In case it does not, feel free to ask for more.
Kind regards
Michael
Am 26.01.2011 um 20:47 schrieb Jan Vlčinský (CAD):
Hi I shall export JSON file based on XML structures I have in my XQuery. Here I found http://demo.exist-db.org/xquery/json-test.xql/source sample, how eXistDB can produce JSON data.
It is like
import module namespace json="http://www.json.org"; 04.
declare option exist:serialize "method=xhtml media-type=text/html";
let $xml1 := 08.
<root> 09. <h1>H</h1> 10. <p/> 11. <p>some text</p> 12. <h2>HH</h2> 13. </root>
<script type="text/javascript"> 43. var data1 = {json:xml-to-json($xml1)}; BaseX does not provide this and I wonder, what options I have and what would anyone recommend • building up plain text piece by piece by XQuery • using some Java lib for this (there are more, any practical experience welcome) • Some other trick, which lives hidden to me (I already queried BaseX wiki and no hit) Jan -- Ing. Jan Vlčinský CAD programy Slunečnicová 338/3, 734 01 Karviná Ráj, Czech Republic tel: +420-597 602 024; mob: +420-608 979 040 skype: janvlcinsky; GoogleTalk: jan.vlcinsky@gmail.com http://cz.linkedin.com/in/vlcinsky _______________________________________________ BaseX-Talk mailing list BaseX-Talk@mailman.uni-konstanz.de https://mailman.uni-konstanz.de/mailman/listinfo/basex-talk
BaseX-Talk mailing list BaseX-Talk@mailman.uni-konstanz.de https://mailman.uni-konstanz.de/mailman/listinfo/basex-talk