From a07d4945c1a301aeaf4b67411065b9adcfac1065 Mon Sep 17 00:00:00 2001 From: jsdelfino Date: Mon, 27 Feb 2012 03:26:51 +0000 Subject: Fix mapping between repeating XML elements, S-expression lists, and JSON array cells. git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1294006 13f79535-47bb-0310-9956-ffa450edef68 --- sca-cpp/trunk/kernel/element.hpp | 4 ++-- sca-cpp/trunk/kernel/xml-test.cpp | 47 +++++++++++++++++++++++++++++++++++++++ sca-cpp/trunk/kernel/xml.hpp | 2 +- 3 files changed, 50 insertions(+), 3 deletions(-) (limited to 'sca-cpp/trunk/kernel') diff --git a/sca-cpp/trunk/kernel/element.hpp b/sca-cpp/trunk/kernel/element.hpp index c69d3bbf07..27b5af8691 100644 --- a/sca-cpp/trunk/kernel/element.hpp +++ b/sca-cpp/trunk/kernel/element.hpp @@ -172,10 +172,10 @@ const list elementToValueGroupValues(const value& v, const list& l if (car(car(l)) != car(v)) return cons(v, l); if (!elementToValueIsList(cadr(car(l)))) { - const value g = mklist(car(v), mklist(cdr(v), cdr(car(l)))); + const value g = mklist(car(v), mklist(isList(cadr(v))? (value)cdr(v) : cadr(v), isList(cadr(car(l)))? (value)cdr(car(l)) : cadr(car(l)))); return elementToValueGroupValues(g, cdr(l)); } - const value g = mklist(car(v), cons(cdr(v), (list)cadr(car(l)))); + const value g = mklist(car(v), cons(isList(cadr(v))? (value)cdr(v) : cadr(v), (list)cadr(car(l)))); return elementToValueGroupValues(g, cdr(l)); } diff --git a/sca-cpp/trunk/kernel/xml-test.cpp b/sca-cpp/trunk/kernel/xml-test.cpp index 7149d1bc41..c505cae9cf 100644 --- a/sca-cpp/trunk/kernel/xml-test.cpp +++ b/sca-cpp/trunk/kernel/xml-test.cpp @@ -73,6 +73,35 @@ const string customerXML = " \n" "\n"; +const string abcXML = +"\n" +"\n" +" abc\n" +" def\n" +" xyz\n" +" tuv\n" +"\n"; + +const string xyzXML = +"\n" +"\n" +" \n" +" 123\n" +" abc\n" +" \n" +" \n" +" 234\n" +" def\n" +" \n" +" \n" +" 345\n" +" xyz\n" +" \n" +" \n" +" 456\n" +" tuv\n" +" \n" +"\n"; const bool isName(const value& token) { return isTaggedList(token, attribute) && attributeName(token) == "name"; @@ -144,6 +173,24 @@ bool testElements() { assert(str(os) == customerXML); } } + { + istringstream is(abcXML); + const list c = readXML(streamList(is)); + const list v = elementsToValues(c); + const list e = valuesToElements(v); + ostringstream os; + writeXML(xmlWriter, &os, e); + assert(str(os) == abcXML); + } + { + istringstream is(xyzXML); + const list c = readXML(streamList(is)); + const list v = elementsToValues(c); + const list e = valuesToElements(v); + ostringstream os; + writeXML(xmlWriter, &os, e); + assert(str(os) == xyzXML); + } { istringstream is(customerXML); const list c = readXML(streamList(is)); diff --git a/sca-cpp/trunk/kernel/xml.hpp b/sca-cpp/trunk/kernel/xml.hpp index fb7c0a6cf6..1f1c664c2d 100644 --- a/sca-cpp/trunk/kernel/xml.hpp +++ b/sca-cpp/trunk/kernel/xml.hpp @@ -253,7 +253,7 @@ const char* encoding = "UTF-8"; const list expandElementValues(const value& n, const list& l) { if (isNil(l)) return l; - return cons(value(cons(element, cons(n, (list)car(l)))), expandElementValues(n, cdr(l))); + return cons(value(cons(element, cons(n, isList(car(l))? (list)car(l) : mklist(car(l))))), expandElementValues(n, cdr(l))); } const failable writeList(const list& l, const xmlTextWriterPtr xml) { -- cgit v1.2.3