XML Datei Parsen mit Xerces. getNodeValue Fehler.



  • Hallo Leute,
    dies ist mein erster Post hier in dem Forum und ich hoffe, dass ihr mir helfen könnt 🙂
    Sitze nun seit einiger Zeit hier auf der Arbeit an einer Art Bankautomaten und bin grade dabei, die Kundendaten aus einer XML Datei auszulesen.
    Meine XML Datei sieht wie folgt aus:

    <?xml version="1.0" encoding="utf-16" standalone="no" ?>
    <bankomat>
      <kunde>
        <vorname>test1</vorname>
        <nachname>test2</nachname>
        <pin>123</pin>
        <kontostand>5000</kontostand>
      </kunde>
      <kunde>
        <vorname>test3</vorname>
        <nachname>test4</nachname>
        <pin>456</pin>
        <kontostand>6000</kontostand>
      </kunde>
    </bankomat>
    

    Nun will ich die Value rausfiltern (Elemente sind kein Problem)
    Also sprich test1, test2 ....
    Dies probiere ich mit getNodeValue wie folgt:

    const XMLCh* value = currentNode->getNodeValue();
    			std::string	currentValue;
    			if (value)
    			{
    				currentValue = xercesc::XMLString::transcode(value);
    				std::cout << value << std::endl;
    				std::cout << currentValue << std::endl;
    			}
    			else
    			{
    				currentValue = "No Value";
    				std::cout << currentValue;
    			}
    

    Hier der gesamte Code:

    class XStr
    {
    public :
        // -----------------------------------------------------------------------
        //  Constructors and Destructor
        // -----------------------------------------------------------------------
        XStr(const char* const toTranscode)
        {
            // Call the private transcoding method
            fUnicodeForm = XMLString::transcode(toTranscode);
        }
    
        ~XStr()
        {
            XMLString::release(&fUnicodeForm);
        }
    
        // -----------------------------------------------------------------------
        //  Getter methods
        // -----------------------------------------------------------------------
        const XMLCh* unicodeForm() const
        {
            return fUnicodeForm;
        }
    
    private :
        // -----------------------------------------------------------------------
        //  Private data members
        //
        //  fUnicodeForm
        //      This is the Unicode XMLCh format of the string.
        // -----------------------------------------------------------------------
        XMLCh*   fUnicodeForm;
    };
    char* xmlFile;
    #define X(str) XStr(str).unicodeForm()
    
    void traverseXml(xercesc::DOMElement *element)
    {   
    
        xercesc::DOMNodeList *children = element->getChildNodes();
        const  XMLSize_t nodeCount = children->getLength();    
    
        for( XMLSize_t n = 0; n < nodeCount; ++n )
        {        
            xercesc::DOMNode *currentNode = children->item(n);
    
            if( currentNode->getNodeType() &&
                    ( currentNode->getNodeType() == xercesc::DOMNode::ELEMENT_NODE )) // is element
            {
            // Found node which is an Element. Re-cast node as element
                xercesc::DOMElement* currentElement = dynamic_cast< xercesc::DOMElement* > ( currentNode );
    
                std::string currentName(xercesc::XMLString::transcode(currentElement->getTagName()));
                std::string elementName(xercesc::XMLString::transcode(element->getTagName()));
    
    			const XMLCh* value = currentNode->getNodeValue();
    			std::string	currentValue;
    			if (value)
    			{
    				currentValue = xercesc::XMLString::transcode(value);
    				std::cout << value << std::endl;
    				std::cout << currentValue << std::endl;
    			}
    			else
    			{
    				currentValue = "No Value";
    				std::cout << currentValue;
    			}
    
                //xercesc::DOMElement* tempElement = dynamic_cast< xercesc::DOMElement* > ( currentNode );
    
                //std::cout << " - " << xercesc::XMLString::transcode(tempElement->getTagName()) << std::endl ;
    			//std::cout << "Element: " << elementName << std::endl;  
    			//std::cout << "Current: " << currentName << std::endl;
    			//std::cout << "Value: " << currentValue << std::endl;
    
                traverseXml(currentElement);
            }
        }
    }
    
    bool parseXML()
    {
        try
        {
            XMLPlatformUtils::Initialize();
        }
    
        catch(const XMLException& toCatch)
        {
            char *pMsg = XMLString::transcode(toCatch.getMessage());
            XERCES_STD_QUALIFIER cerr << "Error during Xerces-c Initialization.\n"
                 << "  Exception message:"
                 << pMsg;
            XMLString::release(&pMsg);
            return 1;
        }
    
      XercesDOMParser* parser = new XercesDOMParser();
    
        xercesc::XMLPlatformUtils::Initialize();
    
        XercesDOMParser* m_configFileParser = new xercesc::XercesDOMParser;
    
        m_configFileParser->setValidationScheme( xercesc::XercesDOMParser::Val_Never );
        m_configFileParser->setDoNamespaces( false );
        m_configFileParser->setDoSchema( false );
        m_configFileParser->setLoadExternalDTD( false );
        m_configFileParser->parse("Kunden.xml");
        parser->getDocument();
        xercesc::DOMDocument *xmlDoc = m_configFileParser->getDocument();
        xercesc::DOMElement *elementRoot = xmlDoc->getDocumentElement();
    
        if( !elementRoot )
        {
            std::cout << "empty XML document" << std::endl;
            return false;
        }
        else
        {
            traverseXml(elementRoot);
        }
    
        return true;
    
    }
    
    int main()
    {
     parseXML();
    }
    

    Hoffe auf Hilfe :-))



  • Ein kurzer Blick auf die APi läßt vermuten, dass
    getTextContent() von DOMNode das ist, was du haben möchtest:

    http://xerces.apache.org/xerces-c/apiDocs-3/classDOMNode.html#676aacf9c5bcc6335be34bd952b10d44

    Gruß,
    XSpille


Anmelden zum Antworten