Интеграция метаданных схемы во время синтаксического анализа XML с помощью Xerces C ++

Я хочу проанализировать XML-файл и найти тип данных атрибутов и сущностей в файле схемы XML (.xsd), когда я прохожу по DOM.

Я обнаружил, что могу использовать информационный набор для проверки схемы поста (PSVI), чтобы получить эту информацию. Для этого я должен получить информацию об узлах с помощью метода getFeature:

info = (xercesc::DOMPSVITypeInfo*) domNode->getFeature(xercesc::XMLUni::fgXercesDOMHasPSVIInfo, xercesc::XMLUni::fgVersion1_1);

Однако сначала мне нужно включить эту функцию. Поскольку в объекте парсера нет метода setFeature, я попробовал «useImplementation», но это просто привело к сбою моей программы.

Поскольку документация Xerces относительно PSVI довольно скудна, возможно, кто-то здесь знает, как получить информацию о схеме при синтаксическом анализе XML-документа с помощью XercesDOMParser.

Заранее спасибо!


person Antigo    schedule 19.01.2016    source источник
comment
Возможно, это поможет: xerces.apache.org/xerces2-j/faq-xs. html   -  person Muster Mark    schedule 19.01.2016
comment
@ user2642282 спасибо за предложение. К сожалению, этот FAQ предназначен для Java, и в API есть некоторые отличия от C ++. Также не сказано как установить свойство для получения PSVIDocumentImpl   -  person Antigo    schedule 19.01.2016


Ответы (2)


Тем временем я нашел решение:

//create parser
static const XMLCh gLS[] = { xercesc::chLatin_L, xercesc::chLatin_S, xercesc::chNull };
xercesc::DOMImplementation *impl = xercesc::DOMImplementationRegistry::getDOMImplementation(gLS);
DOMLSParserImpl* parser = dynamic_cast<DOMLSParserImpl*>(impl->createLSParser(DOMImplementationLS::MODE_SYNCHRONOUS, 0));

//configure
parser->setParameter(xercesc::XMLUni::fgXercesDOMHasPSVIInfo, true);  //collect schema info
parser->setParameter(xercesc::XMLUni::fgDOMComments, false); //discard comments
parser->setExternalNoNamespaceSchemaLocation("schema.xsd");
parser->setDoSchema(true);
parser->setDoNamespaces(true);
parser->setValidationScheme(xercesc::XercesDOMParser::Val_Always);

parser->parseURI("file.xml");

...

xercesc::DOMAttr& attr = (xercesc::DOMAttr&) attributeNode;
cout << " name: " << transcode(attr.getName()) << " type: " << transcode(attr.getSchemaTypeInfo()->getTypeName()) << ", ";

Привести анализатор к классу Impl немного беспорядочно, но я нашел единственный способ получить доступ к функции setParameter. Я думаю, что должен быть "правильный" способ инициализации парсера ...

Также важно установить схему проверки и установить для DoSchema значение true, иначе синтаксический анализатор не будет прикреплять информацию схемы к элементам DOM.

person Antigo    schedule 22.01.2016

У вас должна быть возможность настроить DOMLSParser через его DOMConfiguration, (см. функцию getDomConfig()) и избегайте преобразования в класс реализации . У DOMConfiguration есть пара setParameter() функций, которые должны поддерживать многие свойства конфигурации Xerces, в том числе для проверки правильности схемы XML.

person Michael Glavassevich    schedule 22.01.2016
comment
Привет, спасибо за подсказку! DOMConfiguration действительно предоставляет эти параметры, но если я установлю их через него, я не получу информацию о схеме. Хотя понятия не имею, почему. - person Antigo; 23.01.2016
comment
Не уверен, какую версию Xerces-C вы используете, но должен быть параметр, соответствующий каждому из прямых вызовов, которые вы выполняли в DOMLSParserImpl. - person Michael Glavassevich; 23.01.2016
comment
Сопоставления, извлеченные из текущей версии DOMLSParserImpl.cpp в SVN-репозитории Apache: setExternalNoNamespaceSchemaLocation () - ›XMLUni :: fgXercesSchemaExternalNoNameSpaceSchemaLocation, setDoSchema () -› XMLUni :: fgXercesNameSpaces () - ›XMLUni :: fgDOMValidate - person Michael Glavassevich; 23.01.2016