<?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>仮ぶろぐ &#187; DQ JavaScript</title>
	<atom:link href="http://plusb.jp/blog/?feed=rss2&#038;tag=dq-javascript" rel="self" type="application/rss+xml" />
	<link>http://plusb.jp/blog</link>
	<description>今更なことをそれでもつらづらと書くブログ</description>
	<lastBuildDate>Tue, 07 May 2013 09:06:48 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>XML to JSON</title>
		<link>http://plusb.jp/blog/?p=82</link>
		<comments>http://plusb.jp/blog/?p=82#comments</comments>
		<pubDate>Tue, 26 Jan 2010 14:37:13 +0000</pubDate>
		<dc:creator>M. K.</dc:creator>
				<category><![CDATA[dq]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[ゲーム作成]]></category>
		<category><![CDATA[DQ JavaScript]]></category>

		<guid isPermaLink="false">http://plusb.jp/blog/?p=82</guid>
		<description><![CDATA[今、せっせと誰が使うかわからないJavaScriptライブラリを作成していますが、.NetのXmlSerializerに相当するクラスが欲しくなったので作成（デモ)してみました(jQuery必須)。 ソース：dq-ser &#8230; <a href="http://plusb.jp/blog/?p=82">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>今、せっせと誰が使うかわからない<a href="/dq">JavaScriptライブラリ</a>を作成していますが、.NetのXmlSerializerに相当するクラスが欲しくなったので作成（<a href="/dq/samples/weather.html">デモ</a>)してみました(jQuery必須)。<br />
ソース：<a href="/dq/js/dq-serial.js">dq-serial.js</a><br />
<span id="more-82"></span><br />
基本的には自前で作成したクラスのインスタンスをXMLまたはJSONへシリアライズ（または逆に復元）します。<br />
そのため幾つか癖があります。</p>
<ol>
<li>&#8216;_&#8217;から始まる属性はプライベートとみなしてシリアライズの対象外とします。
</li>
<li>プライベートメンバーから&#8217;_'を省いた同一名称のメソッドがあれば、getterまたはsetterとみなします。</li>
<li>配列の中のプリミティブなオブジェクトは&lt;string /&gt;で括られます</li>
</ol>
<p>具体的には、以下の様になります。</p>
<pre>
Foo = function() {}
Foo.prototype = {
    name: "",   <span style="color:Red;">//これはパブリックメンバー扱い</span>
    _text : "",  <span style="color:Red;">//これはプライベートメンバー扱い</span>
    text: function(value) {
        if(!argument.length) { return this._text; }  <span style="color:Red;">//引数なしならgetter</span>
        this._text = value;
    }
}

var object = new Foo();
object.name = "Hellow,";
object.text("World");
</pre>
<p>で、これをシリアル化すると以下の様になります。</p>
<pre>
&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
&lt;root&gt;
&lt;name&gt;Hellow,&lt;/name&gt;
&lt;text&gt;World&lt;/text&gt;
&lt;/root&gt;
</pre>
<p>で本題?の<code>XML->JSONを実現するには [XML(文字列)→]XML(DOM) → Object [→任意のクラス(必要なら)]→JSON</code>という段階を踏みます。<br />
とりあえず、XML(DOM)からオブジェクトを作成するコードを示しておきます(後は<a href="/dq/samples/weather.html">デモ</a>をみてくださいorz)。</p>
<pre>
_preprocess = function (xml, to) {
    if (xml.attributes == null) {
        return to;
    }
    for (var i = 0; i &lt; xml.attributes.length; i++) {
        var c = xml.attributes[i];
        to[c.nodeName] = $(c).text();<span style="color:Red;">//クロスブラウザの為にjQuery経由で参照</span>
    }
    for (var i = 0; i &lt; xml.childNodes.length; i++) {
        var c = xml.childNodes[i];
        if (c.nodeName == "#text") { <span style="color:Red;">//余分な改行を読み飛ばす</span>
            continue;
        } else if (c.nodeName == "string") { <span style="color:Red;">//プリミティブな値の配列に対応</span>
            if (!(to instanceof Array)) {
                to = [];
            }
            to.push($(c).text());
        } else if (c.childNodes.length == 1 &#038;&#038; c.childNodes[0].nodeType != 1) {
            if (to[c.nodeName]) {
                if (!(to[c.nodeName] instanceof Array)) {
                    var tmp = to[c.nodeName];　<span style="color:Red;">//複数出現した段階で配列化</span>
                    to = [];
                    to.push(tmp);
                }
                to.push($(c).text());
            } else {
                if (to instanceof Array) {
                    to.push($(c).text());
                } else {
                    to[c.nodeName] = $(c).text();
                }
            }
        } else {
            if (to[c.nodeName]) {
                if (!(to[c.nodeName] instanceof Array)) {
                    var tmp = to[c.nodeName];
                    to[c.nodeName] = [];
                    to[c.nodeName].push(tmp);
                }
                var value = {};
                value = _preprocess(c, value);
                to[c.nodeName].push(value);
            } else {
                to[c.nodeName] = {};
                to[c.nodeName] = _preprocess(c, to[c.nodeName]);
            }
        }
    }
    return to;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://plusb.jp/blog/?feed=rss2&#038;p=82</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
