>>1. [java] org.xml.sax.SAXParseException: Parser has reached >> the entity expansion limit "64,000" set by the Application. >> > I'd never heard of this error before, but I'll share a little > secret with you: when I have no idea what an error message > means I just paste it directly into Google. Often I find my answer: > > http://www.google.com/search?q=Parser+has+reached+the+entity+expansion+l imit
> The first result suggests you can set a Java property to make this limit larger: > http://www.macromedia.com/support/coldfusion/ts/documents/xml_entity_lim it.htm > There's more in the Google result page. > > If you're serializing XML as a String, I suspect somewhere someone is XML escaping your package. IE: if your data is "<foo/>", the SOAP may be something like <myXmlData><foo/></myXmlData that's going to make a lot of entities. Sounds like there's a limit to how many it will process. The google hint is great. I usually try this, but I haven't had much luck with searches on AXIS specific questions, and decided to post to the user group. I did make the recommended change, but the program still crashes when the string is too large. For example, when I get an oracle result set of 90K records, then make a call to get the XML, then return it such as: OracleXMLQuery qry = new OracleXMLQuery(conn, sSQL); str = qry.getXMLString(); return str; >>2. [java] faultString: java.lang.reflect.InvocationTargetException > This is a generic "the call failed" exception. Hopefully it has a wrapped exception inside that has more information, maybe it's the SAXParseException you found above? I guess the key here is to get the program to fail gracefully as needed. >>My goal is to send an XML file as a string that another application can >>read and turn into a database file. I already have this working with >>smaller XML strings, but can't get past the errors when getting larger >>datasets back. > I can think of four options for you: > Raise the entity limit big enough for your needs. > Serialize your data as a byte[], UTF-8 encoded. Ugly, but Axis will base64 encode it instead of entity escape it. > Pass your XML directly as XML in the SOAP request. This is what document/literal is all about. I don't have sample code, sorry. > Use attachments. A single attachment should work. Attachments hurt interop, but if you're using Axis on both sides that won't be a problem. The first two are out. On to choice three and four. Passing XML directly is what I thought I was doing. My webservice could be broken into the following: // Get parameter sSQL OracleXMLQuery qry = new OracleXMLQuery(conn, sSQL); str = qry.getXMLString(); return str; // That's about it. The result set is converted to a string by oracle and that is what I return. I am using a a FoxPro application with MS soap client to read the XML String, and display the results in a table. Here is that basic code: local lo lo = createobject("MSSOAP.SoapClient30") lo.mssoapinit("http://localhost:8080/axis/services/DatWS?WSDL") lo.ConnectorProperty("Timeout") = 600000 lcString = lo.getXML("select * from bigtable") XMLTOCURSOR(lcString,"XMLCursor") BROWSE nowait return I have axis returning the result set as a string, and FoxPro reads the file and displays the data, converted into a cursor. For small result sets (under 1000 records) this works great! I am not sure where the problem is for the larger result sets. On to option 4. This is where I get confused, because I haven't found good documentation and/or examples to show how to do this. Now since I am using FoxPro, it seems that I have to use DIME to send the file as attachements. Do attachements work like uploading jpg to a web site? In that case, the work is take care of for you... Also, if I use DIME, with the MSSOAP be able to parse it in an intelligent way so that foxpro will assume that it is one big string that is read into a cursor? My hope is that there is someone out there who has done something like this that can offer some help. Thanks, Ken Lee
