Я пытаюсь разобрать документ 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.
Пожалуйста, посмотрите на этот
Возвращает DOMElement, чей ID указан в elementId. Если нет такого
элемент существует, возвращает ноль. Поведение не определено, если более одного
элемент имеет этот идентификатор. Реализация DOM должна иметь информацию
это говорит, что атрибуты имеют тип ID. Атрибуты с именем
«ID» не имеют типа ID, если не указано иное. Реализации, которые не
знать, будут ли возвращаться атрибуты типа ID или нет
ноль.
Может быть, вы можете получить элемент другими способами? как имя тега?
Решение:
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";
}