String AsXML(const XmlNode& node, dword style) { StringBuffer r; if(style & XML_HEADER) r << XmlHeader(); if(style & XML_DOCTYPE) for(int i = 0; i < node.GetCount(); i++) { const XmlNode& m = node.Node(i); if(m.GetType() == XML_TAG) { r << XmlDocType(m.GetText()); break; } } style &= ~(XML_HEADER|XML_DOCTYPE); switch(node.GetType()) { case XML_PI: r << "<?" << node.GetText() << "?>\r\n"; break; case XML_DECL: r << "<!" << node.GetText() << ">\r\n"; break; case XML_COMMENT: r << "<!--" << node.GetText() << "-->\r\n"; break; case XML_DOC: for(int i = 0; i < node.GetCount(); i++) r << AsXML(node.Node(i), style); break; case XML_TEXT: r << DeXml(node.GetText()); break; case XML_TAG: XmlTag tag(node.GetText()); for(int i = 0; i < node.GetAttrCount(); i++) tag(node.AttrId(i), node.Attr(i)); if(node.GetCount()) { StringBuffer body; for(int i = 0; i < node.GetCount(); i++) body << AsXML(node.Node(i), style); r << tag(~body); } else r << tag(); } return r; }
String FormatXmlRpcError(int code, const char *text) { String r; r << XmlHeader() << "<methodResponse>" "<fault>" "<value>" "<struct>" "<member>" "<name>faultCode</name>" "<value><int>" << code << "</int></value>" "</member>" "<member>" "<name>faultString</name>" "<value><string>" << DeXml(text) << "</string></value>" "</member>" "</struct>" "</value>" "</fault>" "</methodResponse>" ; return r; }
String DeXml(const String& s, byte charset, bool escapelf) { return DeXml(~s, s.End(), charset, escapelf); }
XmlTag& XmlTag::operator()(const char *attr, const char *val) { tag << ' ' << attr << "=\"" << DeXml(val, CHARSET_DEFAULT, true) << "\""; return *this; }
String XmlTag::PreservedText(const char *text, byte charset) { StringBuffer r; return r << tag << " xml:spaces=\"preserve\">" << DeXml(text, charset) << end; }
String XmlTag::Text(const char *text, byte charset) { StringBuffer r; return r << tag << '>' << DeXml(text, charset) << end; }