2008/11/14 Andrew Hartley <[EMAIL PROTECTED]>:
>
> Ok, sorry. I am using VS2005 and the code is in a Regular DLL using shared
> MFC. The version of LibXml2 that I am statically linking to is: 2-2.6.32+
>
> I am loading the Xml from a resource within the DLL in the InitInstance():
>
> ------------------------------------------------------------------------------
> CWinApp::InitInstance();
>
> char szResName[] = "#7001";
> char szResType[] = "TAXONOMYXML";
> HMODULE hMod = AfxGetResourceHandle();
>
> // Load the Xml resource:
> HRSRC hRes = FindResource(hMod, szResName, szResType);
>
> if (hRes)
> {
> HGLOBAL hBytes = LoadResource(hMod, hRes);
> LPVOID lpData = LockResource(hBytes);
> LPBYTE lpbData = (LPBYTE)lpData;
>
> m_pXbrlTaxonomy = new CXbrlTaxonomy(reinterpret_cast<const
> char*>(lpbData));
> }
> return TRUE;
> ------------------------------------------------------------------------------
>
> Which as you can see passes the string read to my classes CXbrlTaxonomy
> constructor the code for which is:
>
> ------------------------------------------------------------------------------
> CXbrlTaxonomy::CXbrlTaxonomy(const string sXml)
> {
> ReadInXml(sXml);
> }
> ------------------------------------------------------------------------------
>
> The ReadInXml(...) [part] is:
>
> ------------------------------------------------------------------------------
> void CXbrlTaxonomy::ReadInXml(const string sXml)
> {
> xmlDocPtr pXmlDoc = xmlReadMemory(sXml.c_str(), (int)sXml.size(),
> "xml",
> NULL, 0);
>
> if (pXmlDoc == NULL)
> {
> xmlErrorPtr pErr = xmlGetLastError();
> AfxMessageBox(pErr->message);
> }
> else
> {
> xmlXPathContextPtr pXPathCtx = xmlXPathNewContext(pXmlDoc);
> ...
>
> ------------------------------------------------------------------------------
>
> The xmlReadMemory(...) returns a valid pointer to an xmlDoc object when I
> run the DLL in Debug mode, but when I switch to Release mode it returns
> NULL. This is probably down to the Xml being read from the resource and I
> will add some code to stream this out to a file so that I may investigate
> that. The reason why I had parsed the sXml.c_str() to a char* and apended a
> LF (0x0a) and then a null terminator was just attempting to see if the
> std::string c_str() function was returning some trailing chars.
>
> As requested if anyone can see a flaw in my code leading to the
> xmlReadMemory(...) returning NULL PLEASE let me know ASAP. If I find
> anything I will post my findings back here, so that if anyone else has a
> similar issue they will know how to resolve it.
My only advise would be:
1) Make _sure_ that the string you're passing to libxml2 is valid XML.
Print it or write it to a file like you suggest. The parser should not
behave differently when compiled with debugging on, so probably it's
your code that constructs the string that does something funky in
Debug mode.
2) Make sure you're linking your program with the correct C runtime.
The program must be linked to the same runtime that libxml2 was linked
against.
Elvis
>
>
>
> Elvis Stansvik wrote:
>>
>> Hi,
>>
>> First of all, please always state your platform and libxml2 version
>> when asking for help. Also provide a complete standalone code example
>> of your problem.
>>
>> 2008/11/13 Andrew Hartley <[EMAIL PROTECTED]>:
>>>
>>> I have written a DLL with a large (size = 1318109 chars) XML stored as a
>>> resource. I read the XML into a std::string and load it with a call to
>>> xmlReadMemory:
>>>
>>> xmlDocPtr pXmlDoc = xmlReadMemory(sXml, sXml.length(), "xml", NULL, 0);
>>
>> This will never work. libxml2 is C not C++ and the API only works with
>> NULL terminated sequences of UTF-8 bytes, not STL strings.
>>
>>>
>>> This works fine in Debug mode. But when I switch to Release mode I get
>>> NULL
>>> returned and the error text is "Extra content at the end of the
>>> document".
>>>
>>> I have tried parsing the std::string content into a char*, and setting
>>> the
>>> argv[3] to "UTF-8":
>>>
>>> int nLen = (int)sXml.size();
>>> char* pszContent = new char[nLen +2];
>>>
>>> strcpy_s(pszContent, nLen +2, sXml.c_str());
>>> pszContent[nLen] = '\n';
>>> pszContent[nLen +1] = '\0';
>>>
>>> xmlDocPtr pXmlDoc = xmlReadMemory(pszContent, nLen, "xml",
>>> "UTF-8", 0);
>>>
>>> delete[] pszContent;
>>> pszContent = NULL;
>>>
>>> But I still get the same error!
>>
>> Your example works here (libxml2 on GNU/Linux):
>>
>> #include <string.h>
>> #include <libxml/parser.h>
>> #include <iostream>
>>
>> int main (int argc, char *argv[])
>> {
>> LIBXML_TEST_VERSION
>>
>> std::string sXml("<foo/>");
>> int nLen = (int)sXml.size();
>> char* pszContent = new char[nLen + 2];
>>
>> strncpy(pszContent, sXml.c_str(), nLen + 2);
>> pszContent[nLen] = '\n';
>> pszContent[nLen + 1] = '\0';
>>
>> xmlDocPtr pXmlDoc = xmlReadMemory(pszContent, nLen, "xml", "UTF-8",
>> 0);
>> if (pXmlDoc == NULL)
>> return(1);
>>
>> delete[] pszContent;
>> pszContent = NULL;
>>
>> xmlFreeDoc(pXmlDoc);
>> xmlCleanupParser();
>>
>> return(0);
>> }
>>
>> [EMAIL PROTECTED] ~]$ g++ -o test `xml2-config --libs --cflags` test.cpp
>> [EMAIL PROTECTED] ~]$ ./test
>> [EMAIL PROTECTED] ~]$ echo $?
>> 0
>> [EMAIL PROTECTED] ~]$
>>
>> Though the reason you are adding an extra newline after the XML eludes
>> me at the moment. Note that I had to use strncpy instead of strcpy_s,
>> as I'm on GNU/Linux where strcpy_s doesn't exist.
>>
>> Regards,
>> Elvis
>>
>>>
>>> I have not resorted to attemting to debug through LibXml2 yet, and would
>>> appreciate any advice.
>>> --
>>> View this message in context:
>>> http://www.nabble.com/xmlReadMemory-%3A-error-%22Extra-content-at-the-end-of-the-document%22-tp20484750p20484750.html
>>> Sent from the Gnome - Lib - Xml - General mailing list archive at
>>> Nabble.com.
>>>
>>> _______________________________________________
>>> xml mailing list, project page http://xmlsoft.org/
>>> [email protected]
>>> http://mail.gnome.org/mailman/listinfo/xml
>>>
>> _______________________________________________
>> xml mailing list, project page http://xmlsoft.org/
>> [email protected]
>> http://mail.gnome.org/mailman/listinfo/xml
>>
>>
>
> --
> View this message in context:
> http://www.nabble.com/xmlReadMemory-%3A-error-%22Extra-content-at-the-end-of-the-document%22-tp20484750p20496939.html
> Sent from the Gnome - Lib - Xml - General mailing list archive at Nabble.com.
>
> _______________________________________________
> xml mailing list, project page http://xmlsoft.org/
> [email protected]
> http://mail.gnome.org/mailman/listinfo/xml
>
_______________________________________________
xml mailing list, project page http://xmlsoft.org/
[email protected]
http://mail.gnome.org/mailman/listinfo/xml