2016-01-19 4 views
0

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

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

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

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

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

Заранее благодарен!

+0

Возможно, это поможет: https://xerces.apache.org/xerces2-j/faq-xs.html –

+0

@ user2642282 благодарит за предложение. К сожалению, этот FAQ для Java и некоторые отличия API от C++. Также он не говорит * как * установить свойство, чтобы получить PSVIDocumentImpl – Antigo

ответ

0

Я нашел решение тем:

//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 элементы.

1

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

+0

Привет, спасибо за подсказку! DOMConfiguration действительно предоставляет эти параметры, но если я их установлю, я не получаю информацию о схеме. Не знаю, почему. – Antigo

+0

Не знаете, какую версию Xerces-C вы используете, но должен быть параметр, соответствующий каждому из прямых вызовов, которые вы делаете на DOMLSParserImpl. –

+0

Отображения, вытащил из текущей версии DOMLSParserImpl.cpp в репозитории SVN сервера Apache: setExternalNoNamespaceSchemaLocation() -> XMLUni :: fgXercesSchemaExternalNoNameSpaceSchemaLocation, setDoSchema() -> XMLUni :: fgXercesSchema, setDoNamespaces() -> XMLUni :: fgDOMNamespaces, setValidationScheme() -> XMLUni :: fgDOMValidate –