Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

вопрос по Xerces c++

27.07.07 15:30
вопрос по Xerces c++
 
A.G.Student коренной житель
A.G.Student
Последний раз изменено 27.07.07 15:31 (A.G.Student)
может кто узех работал с этим парзером,короче нужно програнать документ через него,есть xml и schema xsd ,язык c++ и система AIX.два примера,взял оба у IBM и у Apachi,но не один не работает,даты я могу вычитыватьмчитать документ тоже а вот если ошибку делаю в XML он её не находит,а это как раз то что нужно.может кто имеет опыт,никогда не работал с этим XML ,примеров в нете много,но всё для явы.заранее спасибо всем!
здесь код(если кому интерессно,могу подвешать обе датайки):
первый для DOM:
#include <iostream>
#include <cstdlib>
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/sax/HandlerBase.hpp>
#include <xercesc/util/XMLString.hpp>
XERCES_CPP_NAMESPACE_USE
using namespace std;
XERCES_CPP_NAMESPACE_USE
int main ()
{
XMLPlatformUtils::Initialize();
XMLCh xsdFile[50];
XMLCh xmlFile[50];
//XMLString::transcode("http://www.w3.org/2001/XMLSchema sepade.pain.001.001.02.xsd", xsdFile, 49);
XMLString::transcode("pain.001.001.02.xml", xmlFile, 49);
XercesDOMParser* parser = new XercesDOMParser();
parser->setValidationScheme(XercesDOMParser::Val_Always);
//parser->setValidationSchemaFullChecking(true);
parser->setDoSchema(true);
parser->setDoNamespaces(true);
//parser->setExternalSchemaLocation(xsdFile);
ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase();
parser->setErrorHandler(errHandler);
cout << "**** Start parsen *****" << "\n";
try{
parser->parse(xmlFile);
}
catch (const XMLException& toCatch)
{
char* message = XMLString::transcode(toCatch.getMessage());
cout << "Exception message is: \n" << message << "\n";
XMLString::release(&message);
return -1;
}
catch (const DOMException& toCatch)
{
char* message = XMLString::transcode(toCatch.msg);
cout << "Exception message is: \n"<< message << "\n";
XMLString::release(&message);
return -1;
}
catch (...)
{
cout << "Unexpected Exception \n" ;
return -1;
}


DOMDocument* doc = parser->getDocument();
XMLCh* rootElement = XMLString::transcode("PstlAdr");
DOMNodeList* list = doc->getElementsByTagName(rootElement);
for(int i = 0; i < list->getLength(); i++)
{
DOMElement* element = (DOMElement*)doc->getElementsByTagName(XMLString::transcode("PstlAdr"))->item(i);
DOMNode* node = element->getElementsByTagName(XMLString::transcode("AdrLine"))->item(0);
std::cout << XMLString::transcode(node->getTextContent()) << std::endl;
}

delete parser;
XMLPlatformUtils::Terminate();
std::cout<<"**** ENDE *****"<<endl;
return 0;
}
второй для SAX2:
//#include <xercesc/util/PlatformUtils.hpp>
//#include <xercesc/sax2/SAX2XMLReader.hpp>
//#include <xercesc/sax2/XMLReaderFactory.hpp>
//#include <xercesc/util/OutOfMemoryException.hpp>
//#include <xercesc/sax2/Attributes.hpp>
//#include <xercesc/sax/SAXParseException.hpp>
//#include <xercesc/sax/SAXException.hpp>
//#include <xercesc/sax2/DefaultHandler.hpp>
#include <xercesc/sax2/SAX2XMLReader.hpp>
#include <xercesc/sax2/XMLReaderFactory.hpp>
#include <xercesc/sax2/DefaultHandler.hpp>
#include <xercesc/util/XMLString.hpp>
#include <stdexcept>
#ifndef XERCES_NEW_IOSTREAMS
#include <iostream>
#else
#include <iostream.h>
#endif
#include <fstream>
#include <fstream.h>
#include <stdlib.h>
#include <string.h>
XERCES_CPP_NAMESPACE_USE
int main (int argc, char* args[]) {
try {
XMLPlatformUtils::Initialize();
}
catch (const XMLException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
cout << "Error during initialization! :\n";
cout << "Exception message is: \n"
<< message << "\n";
XMLString::release(&message);
return 1;
}
char* xmlFile = "pain.001.001.02.xml";
SAX2XMLReader* parser = XMLReaderFactory::createXMLReader();
parser->setFeature(XMLUni::fgSAX2CoreValidation, true); // optional
parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true); // optional
parser->setFeature(XMLUni::fgXercesDynamic, false);
parser->setFeature(XMLUni::fgXercesSchema, true);
parser->setFeature(XMLUni::fgXercesSchemaFullChecking, true);



/*parser->setFeature(XMLUni::fgXercesDynamic, false);
parser->setFeature(XMLUni::fgXercesSchema, true);
parser->setFeature(XMLUni::fgXercesSchemaFullChecking, true);

parser->setProperty(XMLUni::fgXercesSchemaExternalSchemaLocation,"sepade.pain.001.001.02.xsd");*/



DefaultHandler* defaultHandler = new DefaultHandler();
parser->setContentHandler(defaultHandler);
parser->setErrorHandler(defaultHandler);
parser->setEntityResolver(defaultHandler);
try {
parser->parse(xmlFile);
}
catch (const XMLException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
cout << "1 Exception message is: \n"
<< message << "\n";
XMLString::release(&message);
return -1;
}
catch (const SAXParseException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
cout << "2 Exception message is: \n"
<< message << "\n"<<toCatch.getLineNumber()<< "\n"<<toCatch.getColumnNumber()<< "\n";
XMLString::release(&message);
return -1;
}
catch (...) {
cout << "Unexpected Exception \n" ;
return -1;
}
delete parser;
delete defaultHandler;
return 0;
}
 

Перейти на