void XPathValidator::parseDTD() { QString dtdPath = (d_corpusReader && d_corpusReader->type() == "tueba_tree") ? ":/dtd/tueba_tree.dtd" : ":/dtd/alpino_ds.dtd"; // XXX - hardcode? QFile dtdFile(dtdPath); if (!dtdFile.open(QFile::ReadOnly)) { qWarning() << "StatisticsWindow::readNodeAttributes(): Could not read DTD."; return; } QByteArray dtdData(dtdFile.readAll()); d_dtd = QSharedPointer<SimpleDTD>(new SimpleDTD(dtdData.constData())); }
HRESULT STDMETHODCALLTYPE W32EntityResolver::resolveEntity(const wchar_t *pwchPublicId, const wchar_t *pwchSystemId, VARIANT *pvarInput) { if (FBREADER_PUBLIC_ID.compare(pwchPublicId) != 0) { return S_OK; } if (FBREADER_SYSTEM_PREFIX.compare(0, FBREADER_SYSTEM_PREFIX.length(), pwchSystemId, FBREADER_SYSTEM_PREFIX.length()) != 0) { return S_OK; } char *buffer = 0; unsigned size = 0; int len = MSXMLUtil::decodeWideChars(pwchSystemId + FBREADER_SYSTEM_PREFIX.length(), -1, &buffer, &size); if (len < 0) { if (buffer != 0) { delete[] buffer; } return E_FAIL; } std::string pattern(buffer, len); delete[] buffer; buffer = 0; if (ZLibrary::FileNameDelimiter.compare("/") != 0) { size_t index = 0; while ((index = pattern.find("/", index)) != -1) { pattern.replace(index, 1, ZLibrary::FileNameDelimiter); } } const std::vector<std::string> &dtds = myReader.externalDTDs(); for (std::vector<std::string>::const_iterator it = dtds.begin(); it != dtds.end(); ++it) { const std::string &fileName = *it; if (fileName.find(pattern, 0) == -1) { continue; } ZLFile dtdFile(fileName); shared_ptr<ZLInputStream> entityStream = dtdFile.inputStream(); if (!entityStream.isNull() && entityStream->open()) { VariantInit(pvarInput); V_VT(pvarInput) = VT_UNKNOWN; V_UNKNOWN(pvarInput) = new W32SynchronousStream(entityStream, true); return S_OK; } } return E_FAIL; }
static void parseDTD(XML_Parser parser, const std::string &fileName) { XML_Parser entityParser = XML_ExternalEntityParserCreate(parser, 0, 0); ZLFile dtdFile(fileName); shared_ptr<ZLInputStream> entityStream = dtdFile.inputStream(); if (!entityStream.isNull() && entityStream->open()) { char buffer[BUFSIZE]; size_t length; do { length = entityStream->read(buffer, BUFSIZE); if (XML_Parse(entityParser, buffer, length, 0) == XML_STATUS_ERROR) { break; } } while (length == BUFSIZE); } XML_ParserFree(entityParser); }