• [^] # Re: La galère

    Posté par . En réponse au message XML, Xerces C++ & XPath. Évalué à 2.

    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.
    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...