in modules/xml/xml.hpp [274:333]
inline const failable<bool> writeList(const list<value>& l, const xmlTextWriterPtr xml) {
if (isNull(l))
return true;
// Write an attribute
const value token(car(l));
if (isTaggedList(token, attribute)) {
if (xmlTextWriterWriteAttribute(xml, (const xmlChar*)c_str(string(attributeName(token))), (const xmlChar*)c_str(string(attributeValue(token)))) < 0)
return mkfailure<bool>("xmlTextWriterWriteAttribute failed");
} else if (isTaggedList(token, element)) {
// Write an element containing a value
if (elementHasValue(token)) {
const value v = elementValue(token);
if (isList(v)) {
// Write an element per entry in a list of values
const list<value> e = expandElementValues(elementName(token), v);
writeList(e, xml);
} else {
// Write an element with a single value
if (xmlTextWriterStartElement(xml, (const xmlChar*)c_str(string(elementName(token)))) < 0)
return mkfailure<bool>("xmlTextWriterStartElement failed");
// Write its children
const failable<bool> w = writeList(elementChildren(token), xml);
if (!hasContent(w))
return w;
if (xmlTextWriterEndElement(xml) < 0)
return mkfailure<bool>("xmlTextWriterEndElement failed");
}
}
else {
// Write an element
if (xmlTextWriterStartElement(xml, (const xmlChar*)c_str(string(elementName(token)))) < 0)
return mkfailure<bool>("xmlTextWriterStartElement failed");
// Write its children
const failable<bool> w = writeList(elementChildren(token), xml);
if (!hasContent(w))
return w;
if (xmlTextWriterEndElement(xml) < 0)
return mkfailure<bool>("xmlTextWriterEndElement failed");
}
} else {
// Write XML text
if (xmlTextWriterWriteString(xml, (const xmlChar*)c_str(string(token))) < 0)
return mkfailure<bool>("xmlTextWriterWriteString failed");
}
// Go on
return writeList(cdr(l), xml);
}