Hmm, maybe I simply nested the XML elements incorrectly (though NullPointerException doesn't give much information about the real problem). I eventually imported this URL:
http://tribecafilm.com/api/xomo/films.json With this code: (defn transform-cast-members-into-xml [cast-members-listed-in-a-vector] (timbre/spy :debug " return value of transform-cast-members-into-xml " (reduce (fn [vector-of-xml-elements next-cast-member-as-map] (conj vector-of-xml-elements (xml/element :cast-member {} (xml/element :film-id {} (get next-cast-member-as-map "film_id")) (xml/element :cast-member-name {} (get next-cast-member-as-map "name")) (xml/element :cast-member-title {} (get next-cast-member-as-map "title"))))) [] cast-members-listed-in-a-vector))) (defn transform-movie-json-to-vector-of-xml-elements [json-to-convert] (timbre/spy :debug "return value of transform-movie-json-to-vector-of-xml-elements" (reduce (fn [vector-of-xml-elements next-json-map] (if (seq next-json-map) (conj vector-of-xml-elements (xml/element :movie {} (xml/element :thumb_img_url {} (get next-json-map "Thumb_img_url")) (xml/element :website_url {} (get next-json-map "website_url")) (xml/element :director {} (get next-json-map "director")) (xml/element :youtube_url {} (get next-json-map "youtube_url")) (xml/element :title {} (get next-json-map "title")) (xml/element :runtime {} (get next-json-map "runtime")) (xml/element :_id {} (get next-json-map "_id")) (xml/element :categories {} (st/join "," (get next-json-map "categories"))) (xml/element :description {} (get next-json-map "description")) (xml/element :cast {} (transform-cast-members-into-xml (get next-json-map "cast"))))) vector-of-xml-elements)) [] json-to-convert))) (defn json-to-xml [request] (let [string-to-convert (slurp "http://tribecafilm.com/api/xomo/films.json") json-to-convert (json/read-str string-to-convert) vector-of-xml-elements (transform-movie-json-to-vector-of-xml-elements json-to-convert) final-xml-element (xml/element :movies {} vector-of-xml-elements) page-string (xml/emit-str final-xml-element) response-headers {:status 200 :headers {"Content-Type" "text/plain"} :body page-string }] response-headers)) On Friday, March 22, 2013 12:02:25 PM UTC-4, larry google groups wrote: > > Thank you. > > I need to import this json and convert it to XML or CSV: > > http://tribecafilm.com/api/xomo/films.json > > I'm guessing that the problem is the nested vector of cast members, which > my project manager has asked me to flatten (I think she is planning work > with this in Microsoft Excel, eventually). > > I start with rows like this: > > ;; > ;; { > ;; "Thumb_img_url":"https:\/\/s3.amazonaws.com > \/tribeca_cms_production\/uploads\/uploads\/film\/photo_1\/513a82d1c07f5d4713000077\/small_odayaka__1_PUBS.jpg", > ;; "website_url":"", > ;; "director":"", > ;; "large_img_url":null, > ;; "youtube_url":"", > ;; "title":"Odayaka", > ;; "runtime":"100", > ;; "id":"513a82d1c07f5d4713000077", > ;; "categories":["Drama"], > ;; "description":"The Great East Japan Earthquake has just > struck, the waters of the ensuing tsunami finally rolling back into the > sea. In the comparative safety of Tokyo, two wives and a child living in > the same apartment building have nothing to do but wait for their > husbands\u2019 return. Nobuteru Uchida finds a striking emotional core to > the shock of March 11, 2011, crafting a tender and intelligent narrative on > the internal effects of an unspeakable national tragedy.", > ;; "cast": > ;; [ > ;; { > ;; "_id":"513a82d1c07f5d4713000078", > ;; "film_id":"513a82d1c07f5d4713000077", > ;; "name":"Jo Keita, > ;; Aya Saito", > ;; "title":"Associate Producer" > ;; }, > ;; { > ;; "_id":"513a82d1c07f5d4713000079", > ;; "film_id":"513a82d1c07f5d4713000077", > ;; "name":"Kiki Sugino, > ;; Yukiko Shinohara, > ;; Takeshi Yamamoto, > ;; Ami Watanabe, > ;; Yu Koyanagi, > ;; Makiko Watanabe", > ;; "title":"Cast" > ;; }, > ;; { > ;; "_id":"513a82d1c07f5d471300007a", > ;; "film_id":"513a82d1c07f5d4713000077", > ;; "name":"Shinichi Tsunoda", > ;; "title":"Cinematographer" > ;; }, > ;; { > ;; "_id":"513a82d1c07f5d471300007b", > ;; "film_id":"513a82d1c07f5d4713000077", > ;; "name":"Jo Keita", > ;; "title":"Composer" > ;; }, > ;; { > ;; "_id":"513a82d1c07f5d471300007c", > ;; "film_id":"513a82d1c07f5d4713000077", > ;; "name":"Nobuteru Uchida", > ;; "title":"Director" > ;; }, > ;; { > ;; "_id":"513a82d1c07f5d471300007d", > ;; "film_id":"513a82d1c07f5d4713000077", > ;; "name":"Nobuteru Uchida", > ;; "title":"Editor" > ;; }, > ;; { > ;; "_id":"513a82d1c07f5d471300007e", > ;; "film_id":"513a82d1c07f5d4713000077", > ;; "name":"Kousuke Ono", > ;; "title":"Executive Producer" > ;; }, > ;; { > ;; "_id":"513a82d1c07f5d471300007f", > ;; "film_id":"513a82d1c07f5d4713000077", > ;; "name":"Kiki Sugino, > ;; Eric Nyari", > ;; "title":"Producer" > ;; }, > ;; { > ;; "_id":"513a82d1c07f5d4713000080", > ;; "film_id":"513a82d1c07f5d4713000077", > ;; "name":"Nobuteru Uchida", > ;; "title":"Screenwriter" > ;; } > ;; ] > ;; }, > > > I flattened this by inventing keys for the nested cast members. But now my > different rows have different keys. I guess I should pad this so they all > have the same rows? Or maybe I've missed something obvious? Seems like I > shouldn't have to engage in ugly hacks for something this simple. > > > > > On Friday, March 22, 2013 11:37:31 AM UTC-4, Gary Verhaegen wrote: >> >> I would guess the NPE comes from the form (xml/emit-str >> (xml/map->Element next-movie-as-map)), given that (conj nil nil) does >> not throw. >> >> Perhaps try to isolate the problem in a smaller chunk of code, and >> then file a bug with the data.xml library? >> >> On 21 March 2013 19:16, larry google groups <lawrenc...@gmail.com> >> wrote: >> > >> > I am getting a null pointer exception in the line where I conj into the >> > vector. I added the pprint so I could see what was going on. I am >> confused >> > by the outcome: >> > >> > (defn convert-json-to-xml [json-as-flat-maps] >> > (reduce >> > (fn [vector-of-strings next-movie-as-map] >> > (println "next move as map: ") >> > (println (pp/pprint next-movie-as-map)) >> > (if (seq next-movie-as-map) >> > (conj vector-of-strings (xml/emit-str (xml/map->Element >> > next-movie-as-map))) >> > vector-of-strings)) >> > [] >> > json-as-flat-maps)) >> > >> > The pprint is showing me this: >> > >> > {:film_64209.9096316473 "513e67e3c07f5dd745000051", >> > :cast_member_64209.9096316473 "5148c50dc07f5db42300003a", >> > :title_64209.9096316473 "Sound design", >> > :director "", >> > :runtime "5", >> > :movie-id "513e67e3c07f5dd745000051", >> > :title "Two Islands", >> > :thumb >> > >> > " >> https://s3.amazonaws.com/tribeca_cms_production/uploads/uploads/film/photo_1/513e67e3c07f5dd745000051/small_TWO_ISLANDS_2_pubs.jpg", >> >> >> > :categories ["Documentary"], >> > :youtube_url "", >> > :website_url "", >> > :name_64209.9096316473 "Svante Colérus", >> > :description >> > "Two Islands is film about two enormous waste dumps in New York City. >> The >> > first was once the largest dump in the world. The other, a cemetery of >> > unknowns, is still in use. Two Islands bluntly asks, what does the >> existence >> > of these two huge mountains of economic and social waste and rejected >> > surplus tell us about our civilization and the so-called richest nation >> in >> > the world? What kind of legacy will future archaeologists see?"} >> > >> > >> > Any thoughts about what triggers a null pointer exception? I am using >> this >> > XML library: >> > >> > http://clojure.github.com/data.xml/ >> > >> > >> > >> > >> > >> > >> > -- >> > -- >> > You received this message because you are subscribed to the Google >> > Groups "Clojure" group. >> > To post to this group, send email to clo...@googlegroups.com >> > Note that posts from new members are moderated - please be patient with >> your >> > first post. >> > To unsubscribe from this group, send email to >> > clojure+u...@googlegroups.com >> > For more options, visit this group at >> > http://groups.google.com/group/clojure?hl=en >> > --- >> > You received this message because you are subscribed to the Google >> Groups >> > "Clojure" group. >> > To unsubscribe from this group and stop receiving emails from it, send >> an >> > email to clojure+u...@googlegroups.com. >> > For more options, visit https://groups.google.com/groups/opt_out. >> > >> > >> > -- -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.