Xerces-C проверяет XML с жестко закодированным xsd - PullRequest
0 голосов
/ 11 сентября 2018

Я пишу библиотеку, которая принимает XML-файлы и анализирует их. Чтобы пользователи не могли загружать в приложение недействительные xmls, я использую xerces для проверки файлов xml через xsd.

Однако мне удается проверять только xsd-файлы. Теоретически, пользователь может просто открыть этот файл и возиться с ним. Вот почему я хотел бы, чтобы мой xsd был жестко закодирован в моей библиотеке.

К сожалению, я еще не нашел способ сделать это с XercesC ++.

Вот как это работает прямо сейчас ...

bool XmlParser::validateXml(std::string a_XsdFilename)
{
    xercesc::XercesDOMParser  domParser;
    if (domParser.loadGrammar(a_XsdFilename.c_str(), xercesc::Grammar::SchemaGrammarType) == NULL)
    {
        throw Exceptions::Parser::XmlSchemaNotReadableException();
    }

    XercesParserErrorHandler parserErrorHandler;

    domParser.setErrorHandler(&parserErrorHandler);
    domParser.setValidationScheme(xercesc::XercesDOMParser::Val_Always);
    domParser.setDoNamespaces(true);
    domParser.setDoSchema(true);
    domParser.setValidationSchemaFullChecking(true);

    domParser.parse(m_Filename.c_str());

    return (domParser.getErrorCount() == 0);

}

std::string m_Filename - переменная-член, содержащая путь проверяемого файла xml.

std::string a_XsdFilename - это путь к xsd, с которым я проверяю.

XercesParserErrorHandler наследуется от xercesc::ErrorHandler и обрабатывает ошибки.

Как мне заменить std::string a_XsdFilename на что-то вроде std::string a_XsdText? Где std::string a_XsdText содержит само определение схемы вместо пути к файлу, содержащему определение схемы.

1 Ответ

0 голосов
/ 23 сентября 2018

Я опишу три способа жесткого кодирования вашего XSD в вашей программе:

  • путем загрузки XSD из пути к файлу (это то, что ваша примерная программа делает прямо сейчас)
  • путем загрузки XSD из строки (это то, что вы просите)
  • путем загрузки XSD из предварительно скомпилированного двоичного файла

Загрузка XSD из пути к файлу

Борис Колпаков предлагает в своем блоге 1014 *, чтобы приложения сами предоставляли файлы схемы XSD, а не искали файлы схемы через xsi: schemaLocation или xsi: noNamespaceSchemaLocation атрибуты найдены в XML-файле.

В сообщении блога есть ссылка на load-grammar-dom , пример программыв свободном доступе), которая использует функцию xercesc :: DOMLSParser :: loadGrammar :

user@linux:~$ load-grammar-dom
usage: load-grammar-dom [test.xsd ... ] [test.xml ...]
user@linux:~$ 

Загрузка XSD из строки

Если вы хотитечтобы передать содержимое файла XSD в виде строки, выВы должны использовать другую перегрузку xercesc :: DOMLSParser :: loadGrammar , где вы передаете

const DOMLSInput *source

вместо

const char *const systemId

DOMLSInput может быть создан с помощью xercesc :: MemBufInputSource и xercesc :: Wrapper4InputSource примерно так

xercesc::Wrapper4InputSource source(
    new xercesc::MemBufInputSource(
       (const XMLByte *) (a_XsdText.c_str()),
    a_XsdText.size(),
    "A name");

(адаптировано несколько изhttps://stackoverflow.com/a/15829424/757777 но не проверено)

Загрузка XSD из предварительно скомпилированного двоичного файла

Включено в программное обеспечение CodeSynthesis XSD встроено * Пример 1062 * (который находится в свободном доступе) демонстрирует, как использовать

xercesc :: BinInputStream и xercesc :: XMLGrammarPool :: deserializeGrammars

для загрузки предварительно скомпилированной схемы XSD.

См. Также README .

В примере содержится программа xsdbin, которая компилирует файлы схемы XSD в двоичный файл.

user@linux:~$ xsdbin --help
Usage: xsdbin [options] <files>
Options:
  --help                 Print usage information and exit.
  --verbose              Print progress information.
  --output-dir <dir>     Write generated files to <dir>.
  --hxx-suffix <sfx>     Header file suffix instead of '-schema.hxx'.
  --cxx-suffix <sfx>     Source file suffix instead of '-schema.cxx'.
  --array-name <name>    Binary data array name.
  --disable-multi-import Disable multiple import support.
user@linux:~$

В make-файле файл схемы XSD предварительно компилируется с помощью xsdbin, и результат попадает в пример исполняемого файла.

...