Changes for page Web Services-Sending Large Data
Last modified by Pascal Robert on 2007/09/03 19:36
From version 2.1
edited by smmccraw
on 2007/07/08 09:46
on 2007/07/08 09:46
Change comment:
There is no comment for this version
To version 4.1
edited by Pascal Robert
on 2007/09/03 19:36
on 2007/09/03 19:36
Change comment:
Migrated to Confluence 4.0
Summary
-
Page properties (3 modified, 0 added, 0 removed)
Details
- Page properties
-
- Title
-
... ... @@ -1,1 +1,1 @@ 1 - Programming__WebObjects-WebServices-Sending Large Data1 +Web Services-Sending Large Data - Author
-
... ... @@ -1,1 +1,1 @@ 1 -XWiki. smmccraw1 +XWiki.probert - Content
-
... ... @@ -1,350 +1,348 @@ 1 -=== Kristoff Cossement 1 +=== Kristoff Cossement === 2 2 3 3 Soap with mime attachments was indeed the way to go. 4 4 5 -Remark: this only works with java 1.4.2 //09 (I did not get it working with java 1.5.x)//5 +Remark: this only works with java 1.4.2_09 (I did not get it working with java 1.5.x) 6 6 7 7 For those who are interested I included some sample code on how to exchange large binary data between a java client and and webobjects server without taking all data in memory. 8 -You also need the java mail and java activation framework from sun. 8 + You also need the java mail and java activation framework from sun. 9 9 10 -==== Client.java 10 +==== Client.java ==== 11 11 12 -{{ panel}}12 +{{code}} 13 13 14 - import javax.xml.soap.SOAPConnectionFactory; 15 - import javax.xml.soap.*; 16 - import javax.xml.transform.stream.*; 17 - import javax.xml.transform.*; 18 - import java.io.*; 19 - import org.apache.axis.attachments.AttachmentPart; 20 - import org.apache.axis.message.*; 21 - import javax.activation.DataHandler; 22 - import javax.activation.FileDataSource; 23 - import javax.xml.soap.SOAPElement; 24 - import java.util.*; 25 - import javax.mail.*; 26 - 27 - public class Client { 28 - 29 - public static File resize(String sPath) 30 - { 31 - File file = new File(sPath); 32 - 33 - 34 - String endPoint = "http://localhost:55555/cgi-bin/WebObjects/project.woa/ws/FileUpload"; 35 - try{ 36 - SOAPConnection connection = SOAPConnectionFactory.newInstance().createConnection(); 37 - SOAPMessage message = (javax.xml.soap.SOAPMessage)MessageFactory.newInstance().createMessage(); 38 - SOAPPart part = message.getSOAPPart(); 39 - SOAPEnvelope envelope = (org.apache.axis.message.SOAPEnvelope)part.getEnvelope(); 40 - SOAPBody body = (org.apache.axis.message.SOAPBody)envelope.getBody(); 41 - SOAPBodyElement operation = (org.apache.axis.message.SOAPBodyElement)body.addBodyElement( 42 - envelope.createName("upload", 43 - "ns", 44 - "http://localhost:55555/cgi-bin/WebObjects/project.woa/ws/FileUpload")); 45 - operation.setEncodingStyle("http://schemas.xmlsoaporg/soap/encoding/"); 46 - 47 - DataHandler dh = new DataHandler(new FileDataSource(file)); 48 - AttachmentPart attachment = (org.apache.axis.attachments.AttachmentPart)message.createAttachmentPart(dh); 49 - SOAPElement filename = operation.addChildElement("filename",""); 50 - SOAPElement source = operation.addChildElement("source",""); 51 - message.addAttachmentPart(attachment); 52 - filename.addTextNode(file.getName()); 53 - source.addTextNode(attachment.getContentId()); 54 - 55 - SOAPMessage result = connection.call(message,endPoint); 56 - System.out.println(result); 57 - part = result.getSOAPPart(); 58 - envelope = (org.apache.axis.message.SOAPEnvelope)part.getEnvelope(); 59 - body = (org.apache.axis.message.SOAPBody)envelope.getBody(); 60 - 61 - if(!body.hasFault()) 62 -________{ 63 -__________System.out.println("answer_:_"+body); 64 -__ 65 -________} 66 -______} 67 -______catch(Exception_e) 68 -______{ 69 -________e.printStackTrace(); 70 -______} 71 -______return_null; 72 -____} 73 -__ 74 -____public_static_void_main(String[]_args)_{ 75 -__ 76 -______try_{ 77 -__ 78 -________resize(args[0]); 79 -__ 80 -______} 81 -______catch_(Exception_e)_{ 82 -________System.out.println(e.getMessage()); 83 -______} 84 -____} 85 -__} 14 + import javax.xml.soap.SOAPConnectionFactory; 15 + import javax.xml.soap.*; 16 + import javax.xml.transform.stream.*; 17 + import javax.xml.transform.*; 18 + import java.io.*; 19 + import org.apache.axis.attachments.AttachmentPart; 20 + import org.apache.axis.message.*; 21 + import javax.activation.DataHandler; 22 + import javax.activation.FileDataSource; 23 + import javax.xml.soap.SOAPElement; 24 + import java.util.*; 25 + import javax.mail.*; 86 86 87 - {{/panel}}27 + public class Client { 88 88 89 -==== Webobjects//Application//.java ==== 29 + public static File resize(String sPath) 30 + { 31 + File file = new File(sPath); 90 90 91 -override//dispatchRequest// 92 92 93 -{{panel}} 34 + String endPoint = "http://localhost:55555/cgi-bin/WebObjects/project.woa/ws/FileUpload"; 35 + try{ 36 + SOAPConnection connection = SOAPConnectionFactory.newInstance().createConnection(); 37 + SOAPMessage message = (javax.xml.soap.SOAPMessage)MessageFactory.newInstance().createMessage(); 38 + SOAPPart part = message.getSOAPPart(); 39 + SOAPEnvelope envelope = (org.apache.axis.message.SOAPEnvelope)part.getEnvelope(); 40 + SOAPBody body = (org.apache.axis.message.SOAPBody)envelope.getBody(); 41 + SOAPBodyElement operation = (org.apache.axis.message.SOAPBodyElement)body.addBodyElement( 42 + envelope.createName("upload", 43 + "ns", 44 + "http://localhost:55555/cgi-bin/WebObjects/project.woa/ws/FileUpload")); 45 + operation.setEncodingStyle("http://schemas.xmlsoaporg/soap/encoding/"); 94 94 95 -__public_WOResponse_dispatchRequest(WORequest_request) 96 -__{ 97 -____WOResponse_result_=_null; 98 -____String_sURI_=_request.uri(); 99 -____NSLog.debug.appendln("Accessing_"_+_sURI); 100 -__ 101 -____Pattern_p_=_Pattern.compile("/ws/FileUpload"); 102 -____Matcher_m_=_p.matcher(sURI); 103 -____if(m.find()) 104 -____{ 105 -______String_sContType_=_request.headerForKey("content-type"); 106 -______p_=_Pattern.compile("multipart/related"); 107 -______m_=_p.matcher(sContType); 108 -______if(m.find()) 109 -______{ 110 -________result_=_Dispatcher.handleFileUpload(request); 111 -______} 112 -______else 113 -______{ 114 -________result_=_super.dispatchRequest(request); 115 -______} 116 -____} 117 -____else 118 -____{ 119 -______result_=_super.dispatchRequest(request); 120 -____} 121 -__ 122 -____return_result; 123 -__ 124 -__} 47 + DataHandler dh = new DataHandler(new FileDataSource(file)); 48 + AttachmentPart attachment = (org.apache.axis.attachments.AttachmentPart)message.createAttachmentPart(dh); 49 + SOAPElement filename = operation.addChildElement("filename",""); 50 + SOAPElement source = operation.addChildElement("source",""); 51 + message.addAttachmentPart(attachment); 52 + filename.addTextNode(file.getName()); 53 + source.addTextNode(attachment.getContentId()); 125 125 126 -{{/panel}} 55 + SOAPMessage result = connection.call(message,endPoint); 56 + System.out.println(result); 57 + part = result.getSOAPPart(); 58 + envelope = (org.apache.axis.message.SOAPEnvelope)part.getEnvelope(); 59 + body = (org.apache.axis.message.SOAPBody)envelope.getBody(); 127 127 128 -==== Dispatcher.java ==== 61 + if(!body.hasFault()) 62 + { 63 + System.out.println("answer : "+body); 129 129 130 -{{panel}} 65 + } 66 + } 67 + catch(Exception e) 68 + { 69 + e.printStackTrace(); 70 + } 71 + return null; 72 + } 131 131 132 -__// 133 -__//_Dispatcher.java 134 -__//_project 135 -__// 136 -__//_Created_by_admin_on_5/5/06. 137 -__//_Copyright_2006___MyCompanyName__._All_rights_reserved. 138 -__// 139 -__import_com.webobjects.foundation.*; 140 -__import_com.webobjects.appserver.*; 141 -__import_com.webobjects.eocontrol.*; 142 -__ 143 -__import_java.io.*; 144 -__import_java.util.regex.*; 145 -__import_org.w3c.dom.*; 146 -__import_javax.xml.transform.*; 147 -__import_javax.xml.transform.stream.*; 148 -__import_javax.xml.transform.dom.*; 149 -__import_javax.xml.parsers.*; 150 -__import_org.apache.axis.attachments.*; 151 -__ 152 -__ 153 -__public_class_Dispatcher_{ 154 -__ 155 -____public_static_WOResponse_handleFileUpload(WORequest_request) 156 -____{ 157 -______String_sContType_=_request.headerForKey("content-type"); 158 -______String_sSoapXml_=_""; 159 -______InputStream_requestStream_=_request.contentInputStream(); 160 -__ 161 -______String_sTempDir_=_System.getProperty("java.io.tmpdir"); 162 -______String_timestamp_=(new_Long(System.currentTimeMillis())).toString(); 163 -______File_fTempFile_=_new_File(sTempDir+"/"+timestamp); 164 -______File_fSavedFile_=_new_File(sTempDir+"/"+timestamp+".out"); 165 -__ 166 -______try 167 -______{ 168 -________BufferedOutputStream_fOut_=_new_BufferedOutputStream(new_FileOutputStream(fTempFile)); 169 -________byte[)_buffer_=_new_byte(32_*_1024]; 170 -________int_bytesRead_=_0; 171 -________while_((bytesRead_=_requestStream.read(buffer))_!= -1) 172 - { 173 - fOut.write(buffer, 0, bytesRead); 174 - } 175 - fOut.close(); 176 - } 177 - catch (Exception e) 178 - { 179 - NSLog.debug.appendln(e.getMessage()); 180 - } 181 - 182 - try 183 - { 184 - InputStream iStream = new FileInputStream(fTempFile); 185 - 186 - MultiPartRelatedInputStream mis = new MultiPartRelatedInputStream(sContType,iStream); 187 - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 188 - Document doc = factory.newDocumentBuilder().parse(mis); 189 - sSoapXml = toString(doc); 190 - NSLog.debug.appendln("SOAP Envelope: " + sSoapXml); 191 - mis.close(); 192 - iStream.close(); 193 - 194 - Node nEnvelope = getNamedChildNode(doc,"Envelope"); 195 - if(null !=_nEnvelope) 196 -________{ 197 -__________Node_nBody_=_getNamedChildNode(nEnvelope,"Body"); 198 -__________if(null_!= nBody) 199 - { 200 - NSArray nSubNodes = getElementChildNodes(nBody); 201 - if((null !=_nSubNodes)_&&_(nSubNodes.count()_>_0)) 202 -____________{ 203 -______________Node_nFileUpload_=_(Node)nSubNodes.get(0); 204 -______________nSubNodes_=_getElementChildNodes(nFileUpload); 205 -______________if((null_!= nSubNodes) && (nSubNodes.count() > 1)) 206 - { 207 - Node nFileName = (Node)nSubNodes.get(0); 208 - Node nData = (Node)nSubNodes.get(1); 209 - 210 - String sFileName = getTextFromNode(nFileName); 211 - String sFileMimeID = getTextFromNode(nData); 212 - 213 - fSavedFile = new File(sTempDir+"/"+sFileName); 214 - 215 - Pattern pattern = Pattern.compile("(boundary=\".+?\")"); 216 - Matcher match = pattern.matcher(sContType); 217 - if(match.find()) 218 - { 219 - String boundary= match.group(1); 220 - String sSubContentType = "multipart/related; type=\"text/xml\"; start=\"<"+sFileMimeID+">\"; "+boundary; 221 - iStream = new FileInputStream(fTempFile); 222 - mis = new MultiPartRelatedInputStream(sSubContentType,iStream); 223 - try 224 - { 225 - BufferedOutputStream fOut = new BufferedOutputStream(new FileOutputStream(fSavedFile)); 226 - byte[) buffer = new byte(32 * 1024]; 227 - int bytesRead = 0; 228 - while ((bytesRead = mis.read(buffer)) !=_-1) 229 -____________________{ 230 -______________________fOut.write(buffer,_0,_bytesRead); 231 -____________________} 232 -____________________mis.close(); 233 -____________________fOut.close(); 234 -__________________} 235 -__________________catch_(Exception_e) 236 -__________________{ 237 -____________________System.out.println(e.getMessage()); 238 -____________________//throw_new_IOException(me_+_"_failed,_got:_"_+_e.toString()); 239 -__________________} 240 -________________} 241 -______________} 242 -____________}__ 243 -__________} 244 -________} 245 -______} 246 -______catch(Exception_e) 247 -______{ 248 -________e.printStackTrace(); 249 -______} 250 -__ 251 -__ 252 -______WOResponse_result_=_new_WOResponse(); 253 -______result.setContent(_"<?xml_version="1.0"_encoding="UTF-8"?>n"+ 254 -__________"<soapenv:Envelope_xmlns:soapenv="http://schemas.xmlsoaporg/soap/envelope/"_xmlns:xsd="http://www.w3.org/2001/XMLSchema"_xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">n"+ 255 -__________"<soapenv:Body>n"+ 256 -__________"<ns:uploadResponse_soapenv:encodingStyle="http://schemas.xmlsoaporg/soap/encoding/"_xmlns:ns="http://localhost:55555/cgi-bin/WebObjects/project.woa/ws/FileUpload">n"+ 257 -__________"<ns:uploadReturn_xsi:type="xsd:boolean">true</ns:uploadReturn>n"+ 258 -__________"</ns:uploadResponse>n"+ 259 -__________"</soapenv:Body>n"+ 260 -__________"</soapenv:Envelope>"); 261 -__ 262 -__ 263 -______result.setHeader("text/xml;_charset=utf-8","content-type"); 264 -__ 265 -__ 266 -______return_result; 267 -__ 268 -____} 269 -__ 270 -__ 271 -____static_public_String_toString(Document_document)_{ 272 -______String_result_=_null; 273 -__ 274 -______if_(document_!= null) { 275 - StringWriter strWtr = new StringWriter(); 276 - StreamResult strResult = new StreamResult(strWtr); 277 - TransformerFactory tfac = TransformerFactory.newInstance(); 278 - try { 279 - Transformer t = tfac.newTransformer(); 280 - t.setOutputProperty(OutputKeys.ENCODING, "utf-8"); 281 - t.setOutputProperty(OutputKeys.INDENT, "yes"); 282 - t.setOutputProperty(OutputKeys.METHOD, "xml"); //xml, html, text 283 - t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); 284 - t.transform(new DOMSource(document.getDocumentElement()), strResult); 285 - } catch (Exception e) { 286 - System.err.println("XML.toString(Document): " + e); 287 - } 288 - result = strResult.getWriter().toString(); 289 - } 290 - 291 - return result; 292 - } 293 - 294 - static public Node getNamedChildNode(Node n, String sChildNodeName) 295 - { 296 - 297 - NodeList nl = n.getChildNodes(); 298 - 299 - for(int i=0;i<nl.getLength();i++) 300 - { 301 - Node s = nl.item(i); 302 - String sChild = s.getNodeName(); 303 - if(sChildNodeName.equalsIgnoreCase(sChild) || sChild.endsWith(":"+sChildNodeName)) 304 - { 305 - NSLog.debug.appendln("childnode = " + s.getNodeName()); 306 - return s; 307 - } 308 - } 309 - 310 - return null; 311 - 312 - } 313 - static public NSArray getElementChildNodes(Node n) 314 - { 315 - NSMutableArray elements = new NSMutableArray(); 316 - NodeList nl = n.getChildNodes(); 317 - 318 - for(int i=0;i<nl.getLength();i++) 319 - { 320 - Node s = nl.item(i); 321 - if(s.getNodeType() == Node.ELEMENT_NODE) 322 - { 323 - NSLog.debug.appendln("childnode = " + s.getNodeName()); 324 - elements.addObject(s); 325 - } 326 - } 327 - 328 - return elements; 329 - } 330 - static public String getTextFromNode(Node n) 331 - { 332 - String text = ""; 333 - 334 - NodeList nl = n.getChildNodes(); 335 - 336 - for(int i=0;i<nl.getLength();i++) 337 - { 338 - Node s = nl.item(i); 339 - if(s.getNodeType() == Node.TEXT_NODE) 340 - { 341 - return s.getNodeValue(); 342 - } 343 - } 344 - return text; 345 - } 346 - } 74 + public static void main(String[] args) { 347 347 348 -{ {/panel}}76 + try { 349 349 350 -Category:WebObjects 78 + resize(args[0]); 79 + 80 + } 81 + catch (Exception e) { 82 + System.out.println(e.getMessage()); 83 + } 84 + } 85 + } 86 + 87 +{{/code}} 88 + 89 +===== Webobjects Application .java ===== 90 + 91 +override dispatchRequest 92 + 93 +{{code}} 94 + 95 + public WOResponse dispatchRequest(WORequest request) 96 + { 97 + WOResponse result = null; 98 + String sURI = request.uri(); 99 + NSLog.debug.appendln("Accessing " + sURI); 100 + 101 + Pattern p = Pattern.compile("/ws/FileUpload"); 102 + Matcher m = p.matcher(sURI); 103 + if(m.find()) 104 + { 105 + String sContType = request.headerForKey("content-type"); 106 + p = Pattern.compile("multipart/related"); 107 + m = p.matcher(sContType); 108 + if(m.find()) 109 + { 110 + result = Dispatcher.handleFileUpload(request); 111 + } 112 + else 113 + { 114 + result = super.dispatchRequest(request); 115 + } 116 + } 117 + else 118 + { 119 + result = super.dispatchRequest(request); 120 + } 121 + 122 + return result; 123 + 124 + } 125 + 126 +{{/code}} 127 + 128 +===== Dispatcher.java ===== 129 + 130 +{{code}} 131 + 132 + // 133 + // Dispatcher.java 134 + // project 135 + // 136 + // Created by admin on 5/5/06. 137 + // Copyright 2006 __MyCompanyName__. All rights reserved. 138 + // 139 + import com.webobjects.foundation.*; 140 + import com.webobjects.appserver.*; 141 + import com.webobjects.eocontrol.*; 142 + 143 + import java.io.*; 144 + import java.util.regex.*; 145 + import org.w3c.dom.*; 146 + import javax.xml.transform.*; 147 + import javax.xml.transform.stream.*; 148 + import javax.xml.transform.dom.*; 149 + import javax.xml.parsers.*; 150 + import org.apache.axis.attachments.*; 151 + 152 + 153 + public class Dispatcher { 154 + 155 + public static WOResponse handleFileUpload(WORequest request) 156 + { 157 + String sContType = request.headerForKey("content-type"); 158 + String sSoapXml = ""; 159 + InputStream requestStream = request.contentInputStream(); 160 + 161 + String sTempDir = System.getProperty("java.io.tmpdir"); 162 + String timestamp =(new Long(System.currentTimeMillis())).toString(); 163 + File fTempFile = new File(sTempDir+"/"+timestamp); 164 + File fSavedFile = new File(sTempDir+"/"+timestamp+".out"); 165 + 166 + try 167 + { 168 + BufferedOutputStream fOut = new BufferedOutputStream(new FileOutputStream(fTempFile)); 169 + byte[] buffer = new byte[32 * 1024]; 170 + int bytesRead = 0; 171 + while ((bytesRead = requestStream.read(buffer)) != -1) 172 + { 173 + fOut.write(buffer, 0, bytesRead); 174 + } 175 + fOut.close(); 176 + } 177 + catch (Exception e) 178 + { 179 + NSLog.debug.appendln(e.getMessage()); 180 + } 181 + 182 + try 183 + { 184 + InputStream iStream = new FileInputStream(fTempFile); 185 + 186 + MultiPartRelatedInputStream mis = new MultiPartRelatedInputStream(sContType,iStream); 187 + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 188 + Document doc = factory.newDocumentBuilder().parse(mis); 189 + sSoapXml = toString(doc); 190 + NSLog.debug.appendln("SOAP Envelope: " + sSoapXml); 191 + mis.close(); 192 + iStream.close(); 193 + 194 + Node nEnvelope = getNamedChildNode(doc,"Envelope"); 195 + if(null != nEnvelope) 196 + { 197 + Node nBody = getNamedChildNode(nEnvelope,"Body"); 198 + if(null != nBody) 199 + { 200 + NSArray nSubNodes = getElementChildNodes(nBody); 201 + if((null != nSubNodes) && (nSubNodes.count() > 0)) 202 + { 203 + Node nFileUpload = (Node)nSubNodes.get(0); 204 + nSubNodes = getElementChildNodes(nFileUpload); 205 + if((null != nSubNodes) && (nSubNodes.count() > 1)) 206 + { 207 + Node nFileName = (Node)nSubNodes.get(0); 208 + Node nData = (Node)nSubNodes.get(1); 209 + 210 + String sFileName = getTextFromNode(nFileName); 211 + String sFileMimeID = getTextFromNode(nData); 212 + 213 + fSavedFile = new File(sTempDir+"/"+sFileName); 214 + 215 + Pattern pattern = Pattern.compile("(boundary=\".+?\")"); 216 + Matcher match = pattern.matcher(sContType); 217 + if(match.find()) 218 + { 219 + String boundary= match.group(1); 220 + String sSubContentType = "multipart/related; type=\"text/xml\"; start=\"<"+sFileMimeID+">\"; "+boundary; 221 + iStream = new FileInputStream(fTempFile); 222 + mis = new MultiPartRelatedInputStream(sSubContentType,iStream); 223 + try 224 + { 225 + BufferedOutputStream fOut = new BufferedOutputStream(new FileOutputStream(fSavedFile)); 226 + byte[] buffer = new byte[32 * 1024]; 227 + int bytesRead = 0; 228 + while ((bytesRead = mis.read(buffer)) != -1) 229 + { 230 + fOut.write(buffer, 0, bytesRead); 231 + } 232 + mis.close(); 233 + fOut.close(); 234 + } 235 + catch (Exception e) 236 + { 237 + System.out.println(e.getMessage()); 238 + //throw new IOException(me + " failed, got: " + e.toString()); 239 + } 240 + } 241 + } 242 + } 243 + } 244 + } 245 + } 246 + catch(Exception e) 247 + { 248 + e.printStackTrace(); 249 + } 250 + 251 + 252 + WOResponse result = new WOResponse(); 253 + result.setContent( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"+ 254 + "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoaporg/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"+ 255 + "<soapenv:Body>\n"+ 256 + "<ns:uploadResponse soapenv:encodingStyle=\"http://schemas.xmlsoaporg/soap/encoding/\" xmlns:ns=\"http://localhost:55555/cgi-bin/WebObjects/project.woa/ws/FileUpload\">\n"+ 257 + "<ns:uploadReturn xsi:type=\"xsd:boolean\">true</ns:uploadReturn>\n"+ 258 + "</ns:uploadResponse>\n"+ 259 + "</soapenv:Body>\n"+ 260 + "</soapenv:Envelope>"); 261 + 262 + 263 + result.setHeader("text/xml; charset=utf-8","content-type"); 264 + 265 + 266 + return result; 267 + 268 + } 269 + 270 + 271 + static public String toString(Document document) { 272 + String result = null; 273 + 274 + if (document != null) { 275 + StringWriter strWtr = new StringWriter(); 276 + StreamResult strResult = new StreamResult(strWtr); 277 + TransformerFactory tfac = TransformerFactory.newInstance(); 278 + try { 279 + Transformer t = tfac.newTransformer(); 280 + t.setOutputProperty(OutputKeys.ENCODING, "utf-8"); 281 + t.setOutputProperty(OutputKeys.INDENT, "yes"); 282 + t.setOutputProperty(OutputKeys.METHOD, "xml"); //xml, html, text 283 + t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); 284 + t.transform(new DOMSource(document.getDocumentElement()), strResult); 285 + } catch (Exception e) { 286 + System.err.println("XML.toString(Document): " + e); 287 + } 288 + result = strResult.getWriter().toString(); 289 + } 290 + 291 + return result; 292 + } 293 + 294 + static public Node getNamedChildNode(Node n, String sChildNodeName) 295 + { 296 + 297 + NodeList nl = n.getChildNodes(); 298 + 299 + for(int i=0;i<nl.getLength();i++) 300 + { 301 + Node s = nl.item(i); 302 + String sChild = s.getNodeName(); 303 + if(sChildNodeName.equalsIgnoreCase(sChild) || sChild.endsWith(":"+sChildNodeName)) 304 + { 305 + NSLog.debug.appendln("childnode = " + s.getNodeName()); 306 + return s; 307 + } 308 + } 309 + 310 + return null; 311 + 312 + } 313 + static public NSArray getElementChildNodes(Node n) 314 + { 315 + NSMutableArray elements = new NSMutableArray(); 316 + NodeList nl = n.getChildNodes(); 317 + 318 + for(int i=0;i<nl.getLength();i++) 319 + { 320 + Node s = nl.item(i); 321 + if(s.getNodeType() == Node.ELEMENT_NODE) 322 + { 323 + NSLog.debug.appendln("childnode = " + s.getNodeName()); 324 + elements.addObject(s); 325 + } 326 + } 327 + 328 + return elements; 329 + } 330 + static public String getTextFromNode(Node n) 331 + { 332 + String text = ""; 333 + 334 + NodeList nl = n.getChildNodes(); 335 + 336 + for(int i=0;i<nl.getLength();i++) 337 + { 338 + Node s = nl.item(i); 339 + if(s.getNodeType() == Node.TEXT_NODE) 340 + { 341 + return s.getNodeValue(); 342 + } 343 + } 344 + return text; 345 + } 346 + } 347 + 348 +{{/code}}