Bon, j'ai retrouvé, mais c'est un peu le foutoir. J'espère que ça te sera quand même utile. J'ai utilisé Xerces et Xalan pour faire des requêtes XPath.
Voilà. Le code est probablement incomplet (c'est juste un copier-coller d'une partie du code). Il faut encore configurer ton environnement pour les librairies et headers de Xalan et Xerces. Mais tu devrais pouvoir assez rapidement compléter ce qui te manque...
[^] # Re: La galère
Posté par Sven Werlen . En réponse au message XML, Xerces C++ & XPath. Évalué à 2.
Voici à peu près à quoi ressemble mon header file: ---------------------------------------------------- // xercesc & xalanc #include <xercesc/dom/DOMDocument.hpp> #include <xercesc/util/PlatformUtils.hpp> #include <xalanc/XalanDOM/XalanDocument.hpp> #include <xalanc/XalanSourceTree/XalanSourceTreeDOMSupport.hpp> #include <xalanc/XalanSourceTree/XalanSourceTreeParserLiaison.hpp> #include <xalanc/XPath/XObjectFactoryDefault.hpp> typedef vector ResultVector; class XPathWrapper { public: class ConstParameters{ public: const char* fXml; ConstParameters( const char* AnXml ) : fXml( AnXml ) {} }; private: // useful for creating new documents XalanSourceTreeDOMSupport support; XalanSourceTreeParserLiaison liaison; protected: XalanDocument* doc; // "default" xml file protected: XPathWrapper(); public: inline bool IsValid() { return doc != NULL; } bool Execute(const char* xpath_query, ResultVector& result ); XalanDocument* GetDocument() { return doc; } // Xerces initialization XPathWrapper( const ConstParameters& c ); // Xerces termination virtual ~XPathWrapper(); }; Et mon fichier source: ---------------------------------------------------- // xercesc & xalanc #include <xercesc/framework/MemBufInputSource.hpp> #include <xercesc/parsers/AbstractDOMParser.hpp> #include <xercesc/dom/DOMImplementation.hpp> #include <xercesc/dom/DOMImplementationLS.hpp> #include <xercesc/dom/DOMImplementationRegistry.hpp> #include <xercesc/dom/DOMElement.hpp> #include <xercesc/dom/DOMBuilder.hpp> #include <xercesc/dom/DOMException.hpp> #include <xercesc/dom/DOMNodeList.hpp> #include <xercesc/dom/DOMError.hpp> #include <xercesc/dom/DOMLocator.hpp> #include <xercesc/dom/DOMNamedNodeMap.hpp> #include <xercesc/dom/DOMAttr.hpp> #include <xalanc/Include/STLHelper.hpp> #include <xalanc/XalanDOM/XalanElement.hpp> #include <xalanc/PlatformSupport/DirectoryEnumerator.hpp> #include <xalanc/PlatformSupport/DOMStringHelper.hpp> #include <xalanc/DOMSupport/DOMServices.hpp> #include <xalanc/XPath/XObjectFactoryDefault.hpp> #include <xalanc/XPath/XPath.hpp> #include <xalanc/XPath/XPathConstructionContextDefault.hpp> #include <xalanc/XPath/XPathEnvSupportDefault.hpp> #include <xalanc/XPath/XPathExecutionContextDefault.hpp> #include <xalanc/XPath/XPathInit.hpp> #include <xalanc/XPath/XPathProcessorImpl.hpp> #include <xalanc/XPath/XPathFactoryDefault.hpp> #include <xalanc/XPath/ElementPrefixResolverProxy.hpp> #include <xalanc/XalanDOM/XalanNamedNodeMap.hpp> #include <xalanc/XalanSourceTree/XalanSourceTreeDOMSupport.hpp> XPathWrapper::XPathWrapper( const ConstParameters& c ) : support(), liaison(support) { try { XMLPlatformUtils::Initialize(); support.setParserLiaison(&liaison); if( !( doc = CreateDocument( c.fXml, c.fIsPath ) ) ) Logger::Put( Level::Error, "XPathWrapper> Initialization failed!" ); } catch(const XMLException&) { Logger::Put(Level::Error, "XMLPlatformUtils::Initialize() failed!"); throw; } } XPathWrapper::~XPathWrapper() { XMLPlatformUtils::Terminate(); } /** * Executes a XPath query, given a parsed document * Returns ALL results as string vector */ bool XPathWrapper::Execute( const char* xpath_query, ResultVector& result ) { try { XObjectPtr xObj; if( !Execute( xpath_query, &xObj ) ) return false; switch ( xObj->getType() ) { case XObject::eTypeNodeSet: { const NodeRefListBase& nodeset = xObj->nodeset(); int len = nodeset.getLength(); for ( int i = 0; i < len; i++ ) { XalanNode* const node = nodeset.item( i ); XalanDOMString str; const int type = node->getNodeType(); switch( node->getNodeType() ) { case XalanNode::COMMENT_NODE: case XalanNode::PROCESSING_INSTRUCTION_NODE: continue; case XalanNode::ELEMENT_NODE: str = node->getNodeName(); break; default: DOMServices::getNodeData( *node, str ); } result.push_back( ConvertXalanString( str ) ); } break; } default: { XalanDOMString str = xObj->str(); result.push_back( ConvertXalanString( str ) ); break; } } } catch(...) { Logger::Put( Level::Error, "XPathWrapper> (Execute2) Exception detected during execution!" ); return false; } return true; }Voilà. Le code est probablement incomplet (c'est juste un copier-coller d'une partie du code). Il faut encore configurer ton environnement pour les librairies et headers de Xalan et Xerces. Mais tu devrais pouvoir assez rapidement compléter ce qui te manque...