Невозможно проанализировать XML с переполнением стека Xerces

Я пытаюсь разобрать документ XML с помощью Xerces-C ++. Я просто хотел бы иметь возможность искать элемент по его идентификатору. Я написал следующий код, но он не работает.

try {
XMLPlatformUtils::Initialize();
}
catch(XMLException& e) {
char* message = XMLString::transcode( e.getMessage() );
cout << "XML toolkit initialization error: " << message << endl;
XMLString::release( &message );
}

XMLCh tempStr[100];
XMLString::transcode("LS", tempStr, 99);
DOMImplementation *impl = DOMImplementationRegistry::getDOMImplementation(tempStr);
DOMLSParser* parser = ((DOMImplementationLS*)impl)->createLSParser(DOMImplementationLS::MODE_SYNCHRONOUS, 0);

char *filename = "C:\\odx1.xml";xercesc::DOMDocument *doc = 0;

try {
doc = parser->parseURI(filename);
DOMElement *element = doc->getElementById(XMLString::transcode("test"));
if(element != NULL) cout << "element found";
cout << "DONE";
}
catch (const XMLException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
cout << "Exception message is: \n"<< message << "\n";
XMLString::release(&message);
return;
}
catch (const DOMException& toCatch) {
char* message = XMLString::transcode(toCatch.msg);
cout << "Exception message is: \n"<< message << "\n";
XMLString::release(&message);
return;
}
catch (...) {
cout << "Unexpected Exception \n" ;
return ;
}

parser->release();
XMLPlatformUtils::Terminate();
}
...

XML это:

<ODX MODEL-VERSION="2.2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="odx.xsd">
<DIAG-LAYER-CONTAINER ID="test">
test done
</DIAG-LAYER-CONTAINER>
</ODX>

Я ожидаю, что он напечатает «элемент найден», но программа корректно завершает работу без печати «элемент найден».

Во всяком случае … в файле XSD, связанном с документом XML, элемент, который я ищу, имеет <xsd:attribute name="ID" type="xsd:ID" use="required"/>
Поэтому я ожидаю, что элемент будет возвращен getElementById.

1

Решение

Пожалуйста, посмотрите на этот

Возвращает DOMElement, чей ID указан в elementId. Если нет такого
элемент существует, возвращает ноль. Поведение не определено, если более одного
элемент имеет этот идентификатор. Реализация DOM должна иметь информацию
это говорит, что атрибуты имеют тип ID. Атрибуты с именем
«ID» не имеют типа ID, если не указано иное. Реализации, которые не
знать, будут ли возвращаться атрибуты типа ID или нет
ноль.

Может быть, вы можете получить элемент другими способами? как имя тега?

3

Другие решения

Решение:

XMLCh tempStr[100];
XMLString::transcode("LS", tempStr, 99);
DOMImplementation *impl = DOMImplementationRegistry::getDOMImplementation(tempStr);
DOMLSParser* parser = ((DOMImplementationLS*)impl)->createLSParser(DOMImplementationLS::MODE_SYNCHRONOUS, 0);
DOMConfiguration* conf = parser->getDomConfig ();
conf->setParameter(XMLUni::fgXercesSchema, true);
char *filename = "C:\\odx1.xml";xercesc::DOMDocument *doc = 0;

try {
doc = parser->parseURI(filename);
DOMElement *element = doc->getElementById(XMLString::transcode("test"));
if(element != NULL) cout << "element found";
cout << "DONE";
}
2

По вопросам рекламы [email protected]