<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>&#8235;שלמה שוורץ - ארכיטקט ומפתח תוכנה&#187; Java/J2EE, FLEX, SAP Portal, JBoss, Spring, Hibernate&#8236;</title>	<atom:link href="http://www.j2ee.co.il/tag/xml/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.j2ee.co.il</link>
	<description>&#8235;מערכות Java, J2EE, FLEX, ActionScript, SAP, C++, C#, Oracle&#8236;</description>	<lastBuildDate>Tue, 06 Dec 2011 09:46:35 +0000</lastBuildDate>
	<language>he</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>&#8235;העברת טופס לXML מAdobe Flex ActionScript3 לJava ובחזרה&#8236;</title>		<link>http://www.j2ee.co.il/%d7%94%d7%a2%d7%91%d7%a8%d7%aa-%d7%98%d7%95%d7%a4%d7%a1-%d7%9cxml-%d7%9eadobe-flex-actionscript3-%d7%9cjava-%d7%95%d7%91%d7%97%d7%96%d7%a8%d7%94/</link>
		<comments>http://www.j2ee.co.il/%d7%94%d7%a2%d7%91%d7%a8%d7%aa-%d7%98%d7%95%d7%a4%d7%a1-%d7%9cxml-%d7%9eadobe-flex-actionscript3-%d7%9cjava-%d7%95%d7%91%d7%97%d7%96%d7%a8%d7%94/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 20:10:50 +0000</pubDate>
		<dc:creator>&#8235;admin&#8236;</dc:creator>				<category><![CDATA[כללי]]></category>
		<category><![CDATA[מאמרים טכנולוגיים]]></category>
		<category><![CDATA[פרויקטי קוד פתוח שפיתחתי]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Adobe Flex]]></category>
		<category><![CDATA[Bean]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[Web Service]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[יועץ]]></category>
		<category><![CDATA[מתכנת]]></category>
		<category><![CDATA[עצמאי]]></category>
		<category><![CDATA[פרילנסר]]></category>

		<guid isPermaLink="false">http://www.shefertech.com/?p=97</guid>
		<description><![CDATA[&#8235;כמתכנת FLEX פרילנסר עצמאי, מצאתי מקרים בהם הלקוח לא עובד בFramework מסודר לתקשורת Client-Server. במקרים כאלה לעיתים יש צורך לעשות Serialize לטופס ולהפוך אותו לפורמט גנרי כמו XML על מנת לשלוח אותו לשרת כלשהו (למשל J2EE Server) ע&#34;י פרוטוקול כמו HTTP או SOAP Web Service. הנה פונקציה פשוטה שכתבתי שלוקחת טופס FLEX, מבצעת עליו סריקה [...]&#8236;]]></description>			<content:encoded><![CDATA[<div dir="rtl"><p>כמתכנת FLEX פרילנסר עצמאי, מצאתי מקרים בהם הלקוח לא עובד בFramework מסודר לתקשורת Client-Server. במקרים כאלה לעיתים יש צורך לעשות Serialize לטופס ולהפוך אותו לפורמט גנרי כמו XML על מנת לשלוח אותו לשרת כלשהו (למשל J2EE Server) ע&quot;י פרוטוקול כמו HTTP או SOAP Web Service. הנה פונקציה פשוטה שכתבתי שלוקחת טופס FLEX, מבצעת עליו סריקה רקורסיבית ושולפת את כל השדות שלו (TextInput) ומחזירה XML עם רשימת השדות והערכים שלהם.<br />
כמו כן מצורף קוד בג'אווה שלוקח XML כזה והופך אותו לJava Bean ובמידה ובBean יש properties תואמים הם יקבלו את ערכי השדות. יש גם פונקציה הפוכה שלוקחת XML וממלאת את השדות בטופס FLEX.</p>
<p>יש להוסיף את הספריות האלה לקוד:</p>
<pre class="brush: as3;">
	import flash.utils.Dictionary;
	import mx.controls.TextInput;
	import mx.core.Container;
</pre>
<p>הנה הפונקציה (למעשה שתי פונקציות) שלוקחת טופס ומחזירה XML:</p>
<pre class="brush: as3;">
		public static function viewToXml(className:String, view:Container):String{
			var xml:XML = &lt;bean class={className}&gt;&lt;/bean&gt;;
			var xmlFinal:XML = addControlsToXml(xml, view);
			return '&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;' + xmlFinal;
		}

		private static function addControlsToXml(xml:XML, view:Container):XML{
			var controls:Array = view.getChildren();
			for (var i:int; i&lt;controls.length; i++){
				if (controls[i] is TextInput){
					var component:TextInput = controls[i] as TextInput;
					var child:XML = &lt;property name={component.id}&gt;{component.text}&lt;/property&gt;;
					xml.appendChild(child);
				}
				if (controls[i] is Container){
					addControlsToXml(xml, controls[i] as Container);
				}
			}
			return xml;
		}
</pre>
<p>והפונקציה שמקבלת XML וממלאת את הטופס בהתאם:</p>
<pre class="brush: as3;">
		private static function xmlToView(props:Dictionary, view:Container):void{
			var controls:Array = view.getChildren();
			for (var i:int; i&lt;controls.length; i++){
				if (controls[i] is TextInput){
					var component:TextInput = controls[i] as TextInput;
					if (props[component.id] != null){
						component.text = props[component.id];
					}
				}
				if (controls[i] is Container){
					xmlToView(props, controls[i] as Container);
				}
			}
		}
</pre>
<p>ועכשיו לקוד בג'אווה. תצטרכו להוסיף את הספריות הבאות:</p>
<pre class="brush: java;">
import java.io.ByteArrayInputStream;
import java.io.StringWriter;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
</pre>
<p>קבלת XML והפיכתו לJava Bean:</p>
<pre class="brush: java;">
	public static Object xmlToBean(String xmlStr){
		DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder documentBuilder = null;
		try {
			documentBuilder = documentBuilderFactory.newDocumentBuilder();
			Document doc = documentBuilder.parse(new ByteArrayInputStream(xmlStr.getBytes(&quot;UTF-8&quot;)));
			XPath xpath = XPathFactory.newInstance().newXPath();
			Node bean = (Node)xpath.evaluate(&quot;//bean&quot;, doc, XPathConstants.NODE);
			if (bean != null){
				NamedNodeMap attributes = bean.getAttributes();
				Node cls = attributes.getNamedItem(&quot;class&quot;);
				String clsName = cls.getNodeValue();
				Object obj = Class.forName(clsName).newInstance();
				NodeList props = (NodeList)xpath.evaluate(&quot;//property&quot;, doc, XPathConstants.NODESET);
				Class cl = obj.getClass();
				for (int i=0; i&lt;props.getLength(); i++){
					String propName = props.item(i).getAttributes().getNamedItem(&quot;name&quot;).getNodeValue();
					String propValue = props.item(i).getTextContent();
					String ch = propName.substring(0, 1).toUpperCase();
					String methodName = &quot;set&quot; + ch + propName.substring(1);
					Method[] methods = cl.getMethods();
					for (Method method : methods){
						if (method.getName().equals(methodName)){
							Class[] paramTypes = method.getParameterTypes();
							for (Class param : paramTypes){
								if (param.getName().equals(&quot;java.lang.String&quot;)){
									method.invoke(obj, propValue);
								}
								else if(param.getName().equals(&quot;int&quot;)){
									method.invoke(obj, Integer.valueOf(propValue));
								}
								else if(param.getName().equals(&quot;long&quot;)){
									method.invoke(obj, Long.valueOf(propValue));
								}
							}
						}
					}
				}
				return obj;
			}
		} catch (Exception e) {
			log.error(e);
		}
		return null;
	}
</pre>
<p>והחלק האחרון: לקחת Java Bean ולהפוך אותו לXML:</p>
<pre class="brush: java;">
	public static String beanToXml(Object obj){
			DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder documentBuilder = null;
			try {
				documentBuilder = documentBuilderFactory.newDocumentBuilder();
			} catch (ParserConfigurationException e) {
				log.error(e);
			}
			Document doc = documentBuilder.newDocument();
			Element rootElement = doc.createElement(&quot;bean&quot;);
			rootElement.setAttribute(&quot;class&quot;, obj.getClass().getName());
			Method[] getters = obj.getClass().getMethods();
			for (Method getter : getters){
					if (getter.getName().indexOf(&quot;get&quot;) == 0)
					if (getter.getParameterTypes().length == 0)
					if (!getter.getName().equals(&quot;getClass&quot;)){
						StringBuffer prop = new StringBuffer(getter.getName().substring(3));
						String ch = prop.substring(0, 1).toLowerCase();
						prop.replace(0, 1, ch);

						Element propElement = doc.createElement(&quot;property&quot;);
						propElement.setAttribute(&quot;name&quot;, prop.toString());
						try {
							propElement.setTextContent(getter.invoke(obj).toString());
						} catch (Exception e) {
							e.printStackTrace();
						}
						rootElement.appendChild(propElement);
					}
			}
			doc.appendChild(rootElement);

			StringWriter stw = new StringWriter();
            Transformer serializer;
			try {
				serializer = TransformerFactory.newInstance().newTransformer();
				serializer.transform(new DOMSource(doc), new StreamResult(stw));
			} catch (Exception e) {
				log.error(e);
			}
            return stw.toString();
	}
</pre>
</div>]]></content:encoded>			<wfw:commentRss>http://www.j2ee.co.il/%d7%94%d7%a2%d7%91%d7%a8%d7%aa-%d7%98%d7%95%d7%a4%d7%a1-%d7%9cxml-%d7%9eadobe-flex-actionscript3-%d7%9cjava-%d7%95%d7%91%d7%97%d7%96%d7%a8%d7%94/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

