예제 #1
0
파일: xml2_schema.cpp 프로젝트: cran/xml2
// [[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;
}
예제 #2
0
// [[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();
}
예제 #3
0
// [[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);
  }
}
예제 #4
0
// [[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);
}
예제 #5
0
// [[Rcpp::export]]
XPtrNode doc_root(XPtrDoc x) {
  return XPtrNode(xmlDocGetRootElement(x.get()));
}
예제 #6
0
// [[Rcpp::export]]
CharacterVector doc_format(XPtrDoc x) {
  xmlChar *s;
  xmlDocDumpMemory(x.get(), &s, NULL);

  return Xml2String(s).asRString();
}