Toon posts:

[Xerces cpp probleem] omzetten van string naar document

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb nu een document geserialized naar een string, iets wat op zich niet zo moeilijk is.
Nu wil ik vanuit deze string terug een DomDocument parsen, dit geeft echter enkele pronlemen, als ik het bekomen document dan terug serialize en uitprint zitten er schijnbaar gn elementen meer in.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
int main(int argC, char* argV[])
{
    // Initialize the XML4C2 system.
    try
    {
        XMLPlatformUtils::Initialize();
    }

    catch(const XMLException& toCatch)
    {
        char *pMsg = XMLString::transcode(toCatch.getMessage());
        cerr << "Error during Xerces-c Initialization.\n"
             << "  Exception message:"
             << pMsg;
        XMLString::release(&pMsg);
        return 1;
    }


    {

        DOMImplementation* impl =  DOMImplementationRegistry::getDOMImplementation(X("Core"));

        DOMDocument* doc = impl->createDocument(
                    0,                    // root element namespace URI.
                    X("company"),         // root element name
                    0);                   // document type object (DTD).

        DOMElement* rootElem = doc->getDocumentElement();

        DOMElement*  prodElem = doc->createElement(X("product"));
        rootElem->appendChild(prodElem);

        DOMText*    prodDataVal = doc->createTextNode(X("Xerces-C"));
        prodElem->appendChild(prodDataVal);

        DOMElement*  catElem = doc->createElement(X("category"));
        rootElem->appendChild(catElem);

        catElem->setAttribute(X("idea"), X("great"));

        DOMText*    catDataVal = doc->createTextNode(X("XML Parsing Tools"));
        catElem->appendChild(catDataVal);

        DOMElement*  devByElem = doc->createElement(X("developedBy"));
        rootElem->appendChild(devByElem);

        DOMText*    devByDataVal = doc->createTextNode(X("Apache Software Foundation"));
        devByElem->appendChild(devByDataVal);

        const DOMNode * nd = doc;
        
        unsigned int elementCount = doc->getElementsByTagName(X("*"))->getLength();
        cout << "The tree just created contains: " << elementCount
             << " elements." << endl;

        DOMWriter         *theSerializer = ((DOMImplementationLS*)impl)->createDOMWriter();
        XMLCh* serializedstring = theSerializer->writeToString(*nd);
    
        cout<<StrXX(serializedstring)<<endl;

        const char* testarray=(StrXX(serializedstring)).localForm();

        InputSource* is = new MemBufInputSource (( XMLByte*)testarray,  strlen(testarray), "bufid"); 
        XercesDOMParser *parser = new XercesDOMParser;
        const DOMDocument * doccie;
        try
        {
        parser->parse(*is);
        doccie = parser->adoptDocument();
        }
        catch (const XMLException& e)
        {
        cerr << "An error occurred during parsing\n   Message: "
             << StrXX(e.getMessage()) << endl;
        }
        //cout<<parser->getErrorCount () ; 
        
        cout<<"-----------------------------------"<<endl;

        XMLCh* serializedstringB = theSerializer->writeToString(*doccie);
        cout<<StrXX(serializedstringB);


   }

    XMLPlatformUtils::Terminate();
    return 0;
}


de output van het programma is als volgt
code:
1
2
3
4
5
6
7
8
9
The tree just created contains: 4 elements.
<?xml version="1.0" encoding="UTF-16" standalone="no" ?>
<company>
<product>Xerces-C</product>
<category idea="great">XML Parsing Tools</category>
<developedBy>Apache Software Foundation</developedBy>
</company>
-----------------------------------
<?xml version="1.0" encoding="UTF-16" standalone="no" ?>


Iemand enig idee waar het misloopt?

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Kun je niet met een goede debugger de code doorlopen?

Verwijderd

Topicstarter
Ik vind niks met de debugger, de twee document objecten zien er id debugger hetzelfde uit

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:56
Beetje een gok, maar bij gebrek aan meer zinnige informatie: zet er nog eens een "cout << endl" (of flush, natuurlijk) achter?

Verwijderd

Topicstarter
Dit is dus gelukt,
nu heb ik die unicode string ook laten omzetten naar een resem bytes

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    XMLTransService::Codes resCode;
        XMLTranscoder* aBig5Transcoder =  XMLPlatformUtils::fgTransService->
             makeNewTranscoderFor("UTF-16", resCode, 16*1024, 
                  XMLPlatformUtils::fgMemoryManager);

        //XMLByte* resultXMLString_Encoded;
        // transcode the string into Big5
        unsigned int charsEaten;
        char resultXMLString_Encoded[16*1024+4];
        aBig5Transcoder->transcodeTo(serializedstring,
                                     XMLString::stringLen(serializedstring),
                                     (XMLByte*) resultXMLString_Encoded,
                                     16*1024,
                                     charsEaten,
                                     XMLTranscoder::UnRep_Throw );


deze chars stuur ik dan door over de socket (ik kan enkel chars sturen over de socket van winsock2)

aan de andere kant van de socket laat ik dan deze stream binnenlopen op SaxBuilder

Java:
1
2
SAXBuilder sb =  new SAXBuilder();
Document d = sb.build(is);


de verbinding tssn de sockets wordt gemaakt maar ik krijg een
org.jdom.JDOMException: Error on line 1: Premature end of input.

iemand enig idee?

[ Voor 25% gewijzigd door Verwijderd op 03-09-2003 11:52 ]