diff options
Diffstat (limited to 'sca-cpp/trunk/kernel')
-rw-r--r-- | sca-cpp/trunk/kernel/element.hpp | 4 | ||||
-rw-r--r-- | sca-cpp/trunk/kernel/xml-test.cpp | 47 | ||||
-rw-r--r-- | sca-cpp/trunk/kernel/xml.hpp | 2 |
3 files changed, 50 insertions, 3 deletions
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<value> elementToValueGroupValues(const value& v, const list<value>& l if (car<value>(car(l)) != car<value>(v)) return cons(v, l); if (!elementToValueIsList(cadr<value>(car(l)))) { - const value g = mklist<value>(car<value>(v), mklist<value>(cdr<value>(v), cdr<value>(car(l)))); + const value g = mklist<value>(car<value>(v), mklist<value>(isList(cadr<value>(v))? (value)cdr<value>(v) : cadr<value>(v), isList(cadr<value>(car(l)))? (value)cdr<value>(car(l)) : cadr<value>(car(l)))); return elementToValueGroupValues(g, cdr(l)); } - const value g = mklist<value>(car<value>(v), cons<value>(cdr<value>(v), (list<value>)cadr<value>(car(l)))); + const value g = mklist<value>(car<value>(v), cons<value>(isList(cadr<value>(v))? (value)cdr<value>(v) : cadr<value>(v), (list<value>)cadr<value>(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 = " </account>\n" "</customer>\n"; +const string abcXML = +"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +"<a>\n" +" <m>abc</m>\n" +" <m>def</m>\n" +" <m>xyz</m>\n" +" <m>tuv</m>\n" +"</a>\n"; + +const string xyzXML = +"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +"<a>\n" +" <m>\n" +" <id>123</id>\n" +" <name>abc</name>\n" +" </m>\n" +" <m>\n" +" <id>234</id>\n" +" <name>def</name>\n" +" </m>\n" +" <m>\n" +" <id>345</id>\n" +" <name>xyz</name>\n" +" </m>\n" +" <m>\n" +" <id>456</id>\n" +" <name>tuv</name>\n" +" </m>\n" +"</a>\n"; const bool isName(const value& token) { return isTaggedList(token, attribute) && attributeName(token) == "name"; @@ -145,6 +174,24 @@ bool testElements() { } } { + istringstream is(abcXML); + const list<value> c = readXML(streamList(is)); + const list<value> v = elementsToValues(c); + const list<value> e = valuesToElements(v); + ostringstream os; + writeXML<ostream*>(xmlWriter, &os, e); + assert(str(os) == abcXML); + } + { + istringstream is(xyzXML); + const list<value> c = readXML(streamList(is)); + const list<value> v = elementsToValues(c); + const list<value> e = valuesToElements(v); + ostringstream os; + writeXML<ostream*>(xmlWriter, &os, e); + assert(str(os) == xyzXML); + } + { istringstream is(customerXML); const list<value> c = readXML(streamList(is)); const list<value> v = elementsToValues(c); 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<value> expandElementValues(const value& n, const list<value>& l) { if (isNil(l)) return l; - return cons<value>(value(cons<value>(element, cons<value>(n, (list<value>)car(l)))), expandElementValues(n, cdr(l))); + return cons<value>(value(cons<value>(element, cons<value>(n, isList(car(l))? (list<value>)car(l) : mklist(car(l))))), expandElementValues(n, cdr(l))); } const failable<bool> writeList(const list<value>& l, const xmlTextWriterPtr xml) { |