// [[Rcpp::export]] Rcpp::LogicalVector doc_validate(XPtrDoc doc, XPtrDoc schema) { xmlLineNumbersDefault(1); Rcpp::CharacterVector vec; xmlSchemaParserCtxtPtr cptr = xmlSchemaNewDocParserCtxt(schema.checked_get()); xmlSchemaSetParserStructuredErrors(cptr, handleSchemaError, &vec); xmlSchemaPtr sptr = xmlSchemaParse(cptr); xmlSchemaValidCtxtPtr vptr = xmlSchemaNewValidCtxt(sptr); xmlSchemaSetValidStructuredErrors(vptr, handleSchemaError, &vec); Rcpp::LogicalVector out; out.push_back(0 == xmlSchemaValidateDoc(vptr, doc.checked_get())); xmlSchemaFreeParserCtxt(cptr); xmlSchemaFreeValidCtxt(vptr); xmlSchemaFree(sptr); out.attr("errors") = vec; return out; }
// [[Rcpp::export]] CharacterVector node_format(XPtrDoc doc, XPtrNode node, bool format = true, int indent = 0) { boost::shared_ptr<xmlBuffer> buffer(xmlBufferCreate(), xmlFree); xmlNodeDump(buffer.get(), doc.get(), node.get(), indent, format); return Xml2String(buffer->content).asRString(); }
// [[Rcpp::export]] void doc_write(XPtrDoc x, std::string path) { FILE* f = fopen(path.c_str(), "wb"); int res = xmlDocDump(f, x.get()); fclose(f); if (res == -1) { Rcpp::stop("Failed to write to %s", path); } }
// [[Rcpp::export]] void node_write(XPtrNode n, XPtrDoc d, std::string path) { FILE* f = fopen(path.c_str(), "wb"); xmlElemDump(f, d.get(), n.get()); fclose(f); }
// [[Rcpp::export]] XPtrNode doc_root(XPtrDoc x) { return XPtrNode(xmlDocGetRootElement(x.get())); }
// [[Rcpp::export]] CharacterVector doc_format(XPtrDoc x) { xmlChar *s; xmlDocDumpMemory(x.get(), &s, NULL); return Xml2String(s).asRString(); }