<?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>Marshal&#039;s Blog &#187; xml</title>
	<atom:link href="http://marshal.easymorse.com/archives/tag/xml/feed" rel="self" type="application/rss+xml" />
	<link>http://marshal.easymorse.com</link>
	<description>It&#039;s swap of marshal&#039;s memory.</description>
	<lastBuildDate>Mon, 30 Jan 2012 07:03:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>识别图书ISBN号并输出查询结果的示例</title>
		<link>http://marshal.easymorse.com/archives/2745?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e8%25af%2586%25e5%2588%25ab%25e5%259b%25be%25e4%25b9%25a6isbn%25e5%258f%25b7%25e5%25b9%25b6%25e8%25be%2593%25e5%2587%25ba%25e6%259f%25a5%25e8%25af%25a2%25e7%25bb%2593%25e6%259e%259c%25e7%259a%2584%25e7%25a4%25ba%25e4%25be%258b</link>
		<comments>http://marshal.easymorse.com/archives/2745#comments</comments>
		<pubDate>Mon, 17 May 2010 10:47:30 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[android view]]></category>
		<category><![CDATA[android webview]]></category>
		<category><![CDATA[android xmlpull]]></category>
		<category><![CDATA[android zxing]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xmlpull]]></category>
		<category><![CDATA[zxing]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/archives/2745</guid>
		<description><![CDATA[写了个技术原型，通过手机识别图书的ISBN条形码，然后通过豆瓣网的API，输出ISBN号对应的图书信息。 示例很简单，上来是个按钮，点击后，进入zxing的activity，用于扫描图书ISBN号。 使用zxing的扫描功能，这次还出现了点儿问题。我的nexus one摄像头比较脏了，造成对焦后无法识别，或者识别的很慢。吓了我一跳，因为以前没有问题的。 更换了几个版本zxing，问题依旧，擦拭了镜头，问题立刻得到了解决。 nexus one的像素和自动对焦能力，也可能包括cpu的处理因素，稍稍对中条码，立刻得到结果。之前的G1就要慢一些。 这也带来了捕获上面截图的困难，因为一瞬间扫描就结束了。怎么办呢？我用手在镜头上揉搓了几下，就可以了，哈哈。 提示找到图书后，通过豆瓣API，获取到图书的XML，这里要说，豆瓣的图书信息还是比较全的，我用国外图书也找到了信息。 因为使用联通WCDMA卡，整个过程很快。 下面说说代码中的一些要点。 如何扫描条形码 现在做条形码扫描，java一般用zxing。zxing有多种复用方式，最简单的方式是，安装zxing软件，通过google market。在自己的应用中，通过Intent调用zxing的扫描条码的Activity，然后将扫描到的结果返回自己的Activity。 比较复杂的办法是，将zxing库包含在自己的程序中，这比较适合正式的应用。 本文使用的是前者。 示例代码 示例源代码见： http://easymorse.googlecode.com/svn/tags/sou.book-0.2 还有一个更为简单的示例，可用于理解调用zxing和豆瓣API的基本过程，见： http://easymorse.googlecode.com/svn/tags/sou.book-0.1 实现activity跳转 在0.2版本中，涉及到3个activity，首先是搜索图书的activity，见最上面的图。点击按钮后，进入zxing的activity，从视觉上看，zxing获取到ISBN号后，进入了第三个activity，显示图书的详细信息。 其实，从zxing得到ISBN号以后，还是返回到搜索图书的activity，但是该activity马上发起新的intent，进入新的activity。另外，这里也演示了如果通过intent共享activity之间的参数。 以下代码创建新的activity，并设置参数： Intent intent = new Intent(); intent.setClass(this, SearchBookActivity.class); intent.putExtra(&#34;ISBN&#34;, data.getExtras().getString(&#34;SCAN_RESULT&#34;)); this.startActivity(intent); 以下是从intent中获取到参数： this.getIntent().getExtras().getString(&#34;ISBN&#34;); 有关zxing的使用，可以参考我另外一个示例，android扫描商品条形码。 webview使用本地页面的考虑 在显示图书查询结果的activity中，使用webview，这样显示可以做的比较灵活和简单。 显示页面有多种做法，比如可以是远程服务器上的页面，这要求有服务器端的支持。看起来这样比较省心，尤其是比如有iphone，有android等等异构终端的情况下。手机开发人员可以将这部分都空出来，交给服务器端去解决。而且是统一的解决方案。 但是，实践中，有两个问题： 服务器端开发人员要为不同手机客户端实现不同的样式，而且服务器端开发者往往并不配备手机设备，这也确实是难以做到的，难道要为一个做适配的服务器端开发人员配备iphone、android和s60手机么？ 手机终端开发者无法灵活的控制webview中的细节，webview（这里指android环境，iphone环境类似的）支持通过javascript访问手机的服务或者对象，但这是平台相关的，android有自己的代码，iphone也有自己的代码，很难在服务器端统一解决。 我在这个原型中试图解决，即，HTML页面在手机端本地，手机端和服务器交互，只是取得数据，而不包含显示样式（也就是HTML页面的内容），手机端通过javascript，将取得的数据注入到本地页面中显示。 这种方式的好处是： 手机端和服务器端交互是获取数据，这是各种手机系统都通用的； 这种方式类似与AJAX，对数据流量的要求也会下降； 手机端开发人员可以灵活的决定页面的样式和交互动作。 在本例中，将html和css放置在项目的assets目录下，另外，该目录下，还有一张图片，用于未加载到图书图片时占位。想像一下，如果不使用webview，这个需求需要编程处理，是比较繁琐的，可参见android异步加载ListView中的图片中的处理。 实现webview的代码很简单，这是一个更简单的示例，见android编写简单的Webview。本例相关代码： this.resultWeb = (WebView) this.findViewById(R.id.resultWeb); [...]]]></description>
			<content:encoded><![CDATA[<p>写了个技术原型，通过手机识别图书的ISBN条形码，然后通过豆瓣网的API，输出ISBN号对应的图书信息。</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/05/image1.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/05/image_thumb1.png" width="244" height="169" /></a> </p>
<p>示例很简单，上来是个按钮，点击后，进入zxing的activity，用于扫描图书ISBN号。</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/05/image2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/05/image_thumb2.png" width="310" height="188" /></a> </p>
<p>使用zxing的扫描功能，这次还出现了点儿问题。我的nexus one摄像头比较脏了，造成对焦后无法识别，或者识别的很慢。吓了我一跳，因为以前没有问题的。</p>
<p> <span id="more-2745"></span>
<p>更换了几个版本zxing，问题依旧，擦拭了镜头，问题立刻得到了解决。</p>
<p>nexus one的像素和自动对焦能力，也可能包括cpu的处理因素，稍稍对中条码，立刻得到结果。之前的G1就要慢一些。</p>
<p>这也带来了捕获上面截图的困难，因为一瞬间扫描就结束了。怎么办呢？我用手在镜头上揉搓了几下，就可以了，哈哈。</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/05/image3.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/05/image_thumb3.png" width="315" height="191" /></a> </p>
<p>提示找到图书后，通过豆瓣API，获取到图书的XML，这里要说，豆瓣的图书信息还是比较全的，我用国外图书也找到了信息。</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/05/image4.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/05/image_thumb4.png" width="215" height="355" /></a> </p>
<p>因为使用联通WCDMA卡，整个过程很快。</p>
<p>下面说说代码中的一些要点。</p>
<h4>如何扫描条形码</h4>
<p>现在做条形码扫描，java一般用zxing。zxing有多种复用方式，最简单的方式是，安装zxing软件，通过google market。在自己的应用中，通过Intent调用zxing的扫描条码的Activity，然后将扫描到的结果返回自己的Activity。</p>
<p>比较复杂的办法是，将zxing库包含在自己的程序中，这比较适合正式的应用。</p>
<p>本文使用的是前者。</p>
<h4>示例代码</h4>
<p>示例源代码见：</p>
<blockquote><p><a href="http://easymorse.googlecode.com/svn/tags/sou.book-0.2">http://easymorse.googlecode.com/svn/tags/sou.book-0.2</a></p>
</blockquote>
<p>还有一个更为简单的示例，可用于理解调用zxing和豆瓣API的基本过程，见：</p>
<blockquote><p><a href="http://easymorse.googlecode.com/svn/tags/sou.book-0.1">http://easymorse.googlecode.com/svn/tags/sou.book-0.1</a></p>
</blockquote>
<h4>实现activity跳转</h4>
<p>在0.2版本中，涉及到3个activity，首先是搜索图书的activity，见最上面的图。点击按钮后，进入zxing的activity，从视觉上看，zxing获取到ISBN号后，进入了第三个activity，显示图书的详细信息。</p>
<p>其实，从zxing得到ISBN号以后，还是返回到搜索图书的activity，但是该activity马上发起新的intent，进入新的activity。另外，这里也演示了如果通过intent共享activity之间的参数。</p>
<p>以下代码创建新的activity，并设置参数：</p>
<blockquote><p>Intent intent = new Intent();     <br />intent.setClass(this, SearchBookActivity.class);      <br />intent.putExtra(&quot;ISBN&quot;, data.getExtras().getString(&quot;SCAN_RESULT&quot;));      <br />this.startActivity(intent);</p>
</blockquote>
<p>以下是从intent中获取到参数：</p>
<blockquote><pre>this.getIntent().getExtras().getString(&quot;ISBN&quot;);</pre>
</blockquote>
<pre>有关zxing的使用，可以参考我另外一个示例，<a href="http://marshal.easymorse.com/archives/1684" title="android扫描商品条形码">android扫描商品条形码</a>。</pre>
<h4>webview使用本地页面的考虑</h4>
<p>在显示图书查询结果的activity中，使用webview，这样显示可以做的比较灵活和简单。</p>
<p>显示页面有多种做法，比如可以是远程服务器上的页面，这要求有服务器端的支持。看起来这样比较省心，尤其是比如有iphone，有android等等异构终端的情况下。手机开发人员可以将这部分都空出来，交给服务器端去解决。而且是统一的解决方案。</p>
<p>但是，实践中，有两个问题：</p>
<ul>
<li>服务器端开发人员要为不同手机客户端实现不同的样式，而且服务器端开发者往往并不配备手机设备，这也确实是难以做到的，难道要为一个做适配的服务器端开发人员配备iphone、android和s60手机么？</li>
<li>手机终端开发者无法灵活的控制webview中的细节，webview（这里指android环境，iphone环境类似的）支持通过javascript访问手机的服务或者对象，但这是平台相关的，android有自己的代码，iphone也有自己的代码，很难在服务器端统一解决。</li>
</ul>
<p>我在这个原型中试图解决，即，HTML页面在手机端本地，手机端和服务器交互，只是取得数据，而不包含显示样式（也就是HTML页面的内容），手机端通过javascript，将取得的数据注入到本地页面中显示。</p>
<p>这种方式的好处是：</p>
<ul>
<li>手机端和服务器端交互是获取数据，这是各种手机系统都通用的；</li>
<li>这种方式类似与AJAX，对数据流量的要求也会下降；</li>
<li>手机端开发人员可以灵活的决定页面的样式和交互动作。</li>
</ul>
<p>在本例中，将html和css放置在项目的assets目录下，另外，该目录下，还有一张图片，用于未加载到图书图片时占位。想像一下，如果不使用webview，这个需求需要编程处理，是比较繁琐的，可参见<a href="http://marshal.easymorse.com/archives/2662" title="android异步加载ListView中的图片">android异步加载ListView中的图片</a>中的处理。</p>
<p>实现webview的代码很简单，这是一个更简单的示例，见<a href="http://marshal.easymorse.com/archives/2648" title="android编写简单的Webview">android编写简单的Webview</a>。本例相关代码：</p>
<blockquote>
<p>this.resultWeb = (WebView) this.findViewById(R.id.resultWeb);<br />
    <br />this.resultWeb.getSettings().setSupportZoom(false);</p>
<p>this.resultWeb.getSettings().setJavaScriptCanOpenWindowsAutomatically(</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; true);</p>
<p>this.resultWeb.getSettings().setJavaScriptEnabled(true); </p>
<p>this.resultWeb.loadUrl(<a href="file:///android_asset/results.html">file:///android_asset/results.html</a>);</p>
<p>&#160;</p>
</blockquote>
<p>这里要注意，setJavaScriptEnabled启用javascript，否则javascript无效。</p>
<h4>android java与html页面中javascript互操作</h4>
<p>javascript和java之间的通信问题，本例只通过javascript调用java，还是比较简单的。如果是java调用javascript，应该需要启动单独的线程来实现。</p>
<p>需要为webview对象创建一个javascript调用的接口对象：</p>
<blockquote>
<p>this.resultWeb.addJavascriptInterface(new Object() {<br />
    <br />&#160;&#160;&#160; public String getBookName() {</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; return bookInfo.getName();</p>
<p>&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160; public String getBookSummary() {<br />
    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return bookInfo.getSummary();</p>
<p>&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160; public String getBookImageUrl() {<br />
    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return bookInfo.getImageUrl();</p>
<p>&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160; public String getBookAuthor() {<br />
    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return bookInfo.getAuthor();</p>
<p>&#160;&#160;&#160; }</p>
<p>}, &quot;searchResult&quot;);</p>
<p>&#160;</p>
</blockquote>
<p>其中第一个参数是javascript调用的对象，第二个参数，是调用对象的名称。</p>
<p>看看javascript中怎样调用这个对象：</p>
<blockquote>
<pre>document.getElementById(&quot;bookName&quot;).innerHTML=window.searchResult.getBookName();</pre>
</blockquote>
<p>可以看到window对象多了个searchResult对象属性，这个searchResult就是上面方法中第二个参数。通过该名字，就调用到了上面第一个参数创建的内部类对象。</p>
<h4>使用豆瓣API</h4>
<p>豆瓣API官方网址：</p>
<blockquote>
<p><a href="http://www.douban.com/service/apidoc/">http://www.douban.com/service/apidoc/</a></p>
</blockquote>
<p>这里仅用到根据ISBN得到图书信息xml的功能。在这里：</p>
<blockquote>
<p><a href="http://www.douban.com/service/apidoc/reference/subject#获取书籍信息">http://www.douban.com/service/apidoc/reference/subject#获取书籍信息</a></p>
</blockquote>
<p>如果匿名使用这个API，有一定的限制：</p>
<blockquote>
<p>API调用被限制为每分钟请求不超过10次。</p>
</blockquote>
<p>这里的调用次数是每ip地址的。对于手机应用来说，大于6秒钟扫描一次图书，应该是够用了。</p>
<h4>解析豆瓣XML查询结果</h4>
<p>对豆瓣的xml查询结果，使用了android自带的xmlpull api进行解析。</p>
<p>这里和<a href="http://marshal.easymorse.com/archives/2664" title="android通过xmlpull解析xml">android通过xmlpull解析xml</a>稍有差别在于，后者是获取xml的属性值，这里是获取节点中的文本内容。</p>
<p>需要：</p>
<blockquote>
<p>if (i == XmlPullParser.START_TAG<br />
    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;&amp; parser.getName().equals(&quot;attribute&quot;)</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;&amp; parser.getAttributeValue(0).equals(&quot;title&quot;)) {</p>
<p>&#160;&#160;&#160; bookInfo.setName(parser.nextText());</p>
<p>&#160;&#160;&#160; Log.v(&quot;soubook&quot;, &quot;title&gt;&gt;&quot; + bookInfo.getName());</p>
<p>&#160;&#160;&#160; continue;</p>
<p>}</p>
<p>&#160;</p>
</blockquote>
<p>通过parser.nextText（）方法获取。另外，要注意在获取完毕后，continue结束本次循环。</p>
<h4>HTML与CSS</h4>
<p>本例中显示查询结果的webview使用了比较难看的灰色背景，主要是为了演示外部css可以很好的和html结合使用。</p>
<p>同理，也应该可以在html页面中引用外部的javascript，打算在下一个版本中加入jquery。</p>
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/2745/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>android通过xmlpull解析xml</title>
		<link>http://marshal.easymorse.com/archives/2664?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=android%25e9%2580%259a%25e8%25bf%2587xmlpull%25e8%25a7%25a3%25e6%259e%2590xml</link>
		<comments>http://marshal.easymorse.com/archives/2664#comments</comments>
		<pubDate>Sat, 24 Apr 2010 11:39:18 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[android xml]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xmlpull]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/?p=2664</guid>
		<description><![CDATA[如果是串行化（serialization）或者相反操作，可以使用xstream，参见android下通过xstream解析xml格式信息。而且很省事儿。 但是如果是解析xml数据，比如获取google weather api，就需要灵活的遍历xml节点和属性。 android SDK提供了xmlpull api，xmlpull和sax类似，是基于流（stream）操作文件，然后根据节点事件回调开发者编写的处理程序。因为是基于流的处理，因此xmlpull和sax都比较节约内存资源，不会象dom那样要把所有节点以对橡树的形式展现在内存中。 xmlpull比sax更简明，而且不需要扫描完整个流。 xmlpull的官方网址在： http://www.xmlpull.org 使用起来很简单，比如google weather api获取数据类似这样： http://easymorse.googlecode.com/svn/tags/android.xmlpull.google.weather-1.0/assets/weather.xml 现在比如只想获取current_conditions元素节点的信息，即只获取当前的天气信息。想要产生的效果类似这样： 代码： private void setWeatherInfo(TextView textView) throws XmlPullParserException, IOException { XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); factory.setNamespaceAware(true); XmlPullParser parser = factory.newPullParser(); parser.setInput(this.getAssets().open(“weather.xml”), “UTF-8&#8243;); for (int i = parser.getEventType(); i != XmlPullParser.END_DOCUMENT; i = parser .next()) { if (i == XmlPullParser.START_TAG &#38;&#38; parser.getName().equals(“current_conditions”)) { [...]]]></description>
			<content:encoded><![CDATA[<p>如果是串行化（serialization）或者相反操作，可以使用xstream，参见<a href="http://marshal.easymorse.com/archives/1715" title="android下通过xstream解析xml格式信息">android下通过xstream解析xml格式信息</a>。而且很省事儿。</p>
<p>但是如果是解析xml数据，比如获取google weather api，就需要灵活的遍历xml节点和属性。</p>
<p>android SDK提供了xmlpull api，xmlpull和sax类似，是基于流（stream）操作文件，然后根据节点事件回调开发者编写的处理程序。因为是基于流的处理，因此xmlpull和sax都比较节约内存资源，不会象dom那样要把所有节点以对橡树的形式展现在内存中。</p>
<p>xmlpull比sax更简明，而且不需要扫描完整个流。</p>
<p>xmlpull的官方网址在：</p>
<blockquote>
<p><a href="http://www.xmlpull.org">http://www.xmlpull.org</a></p>
</blockquote>
<p>使用起来很简单，比如google weather api获取数据类似这样：</p>
<blockquote>
<p><a href="http://easymorse.googlecode.com/svn/tags/android.xmlpull.google.weather-1.0/assets/weather.xml">http://easymorse.googlecode.com/svn/tags/android.xmlpull.google.weather-1.0/assets/weather.xml</a></p>
</blockquote>
<p>现在比如只想获取current_conditions元素节点的信息，即只获取当前的天气信息。想要产生的效果类似这样：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/04/2010-04-24___07.31.44.png" class="image-link"><img class="linked-to-original" src="http://marshal.easymorse.com/wp-content/uploads/2010/04/2010-04-24___07-thumb.31.445.png" height="117" align="left" width="480" /></a></p>
<div style="text-align: left;">
  
</div>
<p>代码：</p>
<blockquote>
<p>private void setWeatherInfo(TextView textView)<br />
  throws XmlPullParserException, IOException {<br />
  XmlPullParserFactory factory = XmlPullParserFactory.newInstance();<br />
  factory.setNamespaceAware(true);<br />
  XmlPullParser parser = factory.newPullParser();<br />
  parser.setInput(this.getAssets().open(“weather.xml”), “UTF-8&#8243;);<br />
  for (int i = parser.getEventType(); i != XmlPullParser.END_DOCUMENT; i = parser<br />
  .next()) {<br />
  if (i == XmlPullParser.START_TAG<br />
  &amp;&amp; parser.getName().equals(“current_conditions”)) {<br />
  StringBuilder builder = new StringBuilder();<br />
  for (int j = parser.getEventType();; j = parser.next()) {<br />
  if (j == XmlPullParser.END_TAG<br />
  &amp;&amp; parser.getName().equals(“current_conditions”)) {<br />
  break;<br />
  }<br />
  if (j == XmlPullParser.START_TAG) {<br />
  if (parser.getName().equals(“temp_c”)) {<br />
  builder.append(“当前气温：”).append(<br />
  parser.getAttributeValue(0)).append(“摄氏度”);<br />
  }<br />
  if(parser.getName().equals(“wind_condition”)){<br />
  builder.append(“, “).append(parser.getAttributeValue(0));<br />
  }<br />
  }<br />
  }<br />
  textView.setText(builder.toString());<br />
  }<br />
  }<br />
  }</p>
</blockquote>
<p>源代码：</p>
<blockquote>
<p><a href="http://easymorse.googlecode.com/svn/tags/android.xmlpull.google.weather-1.0/">http://easymorse.googlecode.com/svn/tags/android.xmlpull.google.weather-1.0/</a></p>
</blockquote>
<p><br class="final-break" /></p>
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/2664/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>java中易于使用的几种xml读取工具</title>
		<link>http://marshal.easymorse.com/archives/2095?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=java%25e4%25b8%25ad%25e6%2598%2593%25e4%25ba%258e%25e4%25bd%25bf%25e7%2594%25a8%25e7%259a%2584%25e5%2587%25a0%25e7%25a7%258dxml%25e8%25af%25bb%25e5%258f%2596%25e5%25b7%25a5%25e5%2585%25b7</link>
		<comments>http://marshal.easymorse.com/archives/2095#comments</comments>
		<pubDate>Mon, 21 Dec 2009 09:33:37 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[java xml]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/archives/2095</guid>
		<description><![CDATA[有时候需要简单的xml读取工具，读取子节点或者节点的属性。如果用正则表达式，比较麻烦，而且容易出错。 digester apache commons项目中的digester，可以加入到maven中： &#60;dependency&#62; &#160;&#160;&#160; &#60;groupId&#62;commons-digester&#60;/groupId&#62; &#160;&#160;&#160; &#60;artifactId&#62;commons-digester&#60;/artifactId&#62; &#160;&#160;&#160; &#60;version&#62;2.0&#60;/version&#62; &#60;/dependency&#62; &#160; 代码编写很简单，比如有如下javabean： package mypackage; public class Foo { public void addBar(Bar bar); public Bar findBar(int id); public Iterator getBars(); public String getName(); public void setName(String name); } package mypackage; public class Bar { public int getId(); public void setId(int id); public String getTitle(); [...]]]></description>
			<content:encoded><![CDATA[<p>有时候需要简单的xml读取工具，读取子节点或者节点的属性。如果用正则表达式，比较麻烦，而且容易出错。</p>
<h3>digester</h3>
<p>apache commons项目中的digester，可以加入到maven中：</p>
<blockquote><p>&lt;dependency&gt;     <br />&#160;&#160;&#160; &lt;groupId&gt;commons-digester&lt;/groupId&gt;      <br />&#160;&#160;&#160; &lt;artifactId&gt;commons-digester&lt;/artifactId&gt;      <br />&#160;&#160;&#160; &lt;version&gt;2.0&lt;/version&gt;      <br />&lt;/dependency&gt;</p>
<p>&#160;</p>
</blockquote>
<p> <span id="more-2095"></span>
<p>代码编写很简单，比如有如下javabean：</p>
<blockquote><pre>  package mypackage;
  public class Foo {
    public void addBar(Bar bar);
    public Bar findBar(int id);
    public Iterator getBars();
    public String getName();
    public void setName(String name);
  }

  package mypackage;
  public class Bar {
    public int getId();
    public void setId(int id);
    public String getTitle();
    public void setTitle(String title);
  }</pre>
<p>&#160;</p>
</blockquote>
<p>现在可以将如下xml文档转为javabean的实例：</p>
<blockquote>
<pre>&lt;foo name=&quot;The Parent&quot;&gt;
    &lt;bar id=&quot;123&quot; title=&quot;The First Child&quot;/&gt;
    &lt;bar id=&quot;456&quot; title=&quot;The Second Child&quot;/&gt;
  &lt;/foo&gt;</pre>
<p>&#160;</p>
</blockquote>
<p>代码片段：</p>
<blockquote>
<pre>  Digester digester = new Digester();
  digester.setValidating(false);
  digester.addObjectCreate(&quot;foo&quot;, &quot;mypackage.Foo&quot;);
  digester.addSetProperties(&quot;foo&quot;);
  digester.addObjectCreate(&quot;foo/bar&quot;, &quot;mypackage.Bar&quot;);
  digester.addSetProperties(&quot;foo/bar&quot;);
  digester.addSetNext(&quot;foo/bar&quot;, &quot;addBar&quot;, &quot;mypackage.Bar&quot;);
  Foo foo = (Foo) digester.parse();</pre>
<p>&#160;</p>
</blockquote>
<p>参见文档：</p>
<blockquote>
<p><a href="http://commons.apache.org/digester/commons-digester-2.0/docs/api/org/apache/commons/digester/package-summary.html">http://commons.apache.org/digester/commons-digester-2.0/docs/api/org/apache/commons/digester/package-summary.html</a></p>
</blockquote>
<h3>xstream</h3>
<p>也是类似的工具，在<a href="http://marshal.easymorse.com/archives/1715" title="android下通过xstream解析xml格式信息">android下通过xstream解析xml格式信息</a>中已经演示了在android中的是使用。网址：</p>
<blockquote>
<p><a href="http://xstream.codehaus.org/">http://xstream.codehaus.org/</a></p>
</blockquote>
<p>简单的官方教程：</p>
<blockquote>
<p><a href="http://xstream.codehaus.org/tutorial.html">http://xstream.codehaus.org/tutorial.html</a></p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/2095/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>android下通过xstream解析xml格式信息</title>
		<link>http://marshal.easymorse.com/archives/1715?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=xml%25e6%25a0%25bc%25e5%25bc%258f%25e5%2590%2591android-http%25e5%25ae%25a2%25e6%2588%25b7%25e7%25ab%25af%25e4%25bc%25a0%25e8%25be%2593%25e6%2595%25b0%25e6%258d%25ae</link>
		<comments>http://marshal.easymorse.com/archives/1715#comments</comments>
		<pubDate>Tue, 27 Oct 2009 08:48:39 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xstream]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/archives/1715</guid>
		<description><![CDATA[可以通过json格式向android http客户端传输数据，见：android下支持json的远程访问，也可以用xml格式。 下面是一个xml文件的格式示例。 &#60;product&#62; &#160;&#160;&#160; &#60;name&#62;NetGear 614v9无线路由器&#60;/name&#62; &#160;&#160;&#160; &#60;createTime&#62;2009-10-27 00:00:00.0 CST&#60;/createTime&#62; &#60;/product&#62; 下载或者访问该xml文件： 如果解析上面的xml文件呢？这里选用了xstream，网址： http://xstream.codehaus.org/ xstream可以自动解析文件，并且根据xml数据实例化javabean。如果不这样，需要手工编写SAX API代码解析。 首先编写了一个对应的Product的javabean： package com.easymorse; import java.util.Date; public class Product {&#160;&#160;&#160; @Override&#160;&#160;&#160; public String toString() {&#160;&#160;&#160;&#160;&#160;&#160;&#160; return “Product [createTime=" + createTime.toLocaleString() + ", name=" + name + "]“;&#160;&#160;&#160; } &#160;&#160;&#160; private String name; &#160;&#160;&#160; public String getName() {&#160;&#160;&#160;&#160;&#160;&#160;&#160; return name;&#160;&#160;&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>可以通过json格式向android http客户端传输数据，见：<a href="http://marshal.easymorse.com/archives/1707" title="android下支持json的远程访问">android下支持json的远程访问</a>，也可以用xml格式。</p>
<p>下面是一个xml文件的格式示例。</p>
<blockquote><p>&lt;product&gt; <br />&nbsp;&nbsp;&nbsp; &lt;name&gt;NetGear 614v9无线路由器&lt;/name&gt; <br />&nbsp;&nbsp;&nbsp; &lt;createTime&gt;2009-10-27 00:00:00.0 CST&lt;/createTime&gt; <br />&lt;/product&gt; </p>
</blockquote>
<p>下载或者访问该xml文件：[Download not found]</p>
<p>如果解析上面的xml文件呢？这里选用了xstream，网址：</p>
<blockquote><p><a href="http://xstream.codehaus.org/">http://xstream.codehaus.org/</a></p>
</blockquote>
<p> <span id="more-1715"></span>
<p>xstream可以自动解析文件，并且根据xml数据实例化javabean。如果不这样，需要手工编写SAX API代码解析。</p>
<p>首先编写了一个对应的Product的javabean：</p>
<blockquote><p>package com.easymorse;
<p>import java.util.Date;
<p>public class Product {<br />&nbsp;&nbsp;&nbsp; @Override<br />&nbsp;&nbsp;&nbsp; public String toString() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return “Product [createTime=" + createTime.toLocaleString() + ", name=" + name + "]“;<br />&nbsp;&nbsp;&nbsp; }
<p>&nbsp;&nbsp;&nbsp; private String name;
<p>&nbsp;&nbsp;&nbsp; public String getName() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return name;<br />&nbsp;&nbsp;&nbsp; }
<p>&nbsp;&nbsp;&nbsp; public void setName(String name) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = name;<br />&nbsp;&nbsp;&nbsp; }
<p>&nbsp;&nbsp;&nbsp; public Date getCreateTime() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return createTime;<br />&nbsp;&nbsp;&nbsp; }
<p>&nbsp;&nbsp;&nbsp; public void setCreateTime(Date createTime) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.createTime = createTime;<br />&nbsp;&nbsp;&nbsp; }
<p>&nbsp;&nbsp;&nbsp; private Date createTime;<br />}
<p>&nbsp;</p>
</blockquote>
<p>然后，需要类似这样调用xstream的代码（代码还是改自<a href="http://marshal.easymorse.com/archives/1693" title="实现android activity之间的跳转">实现android activity之间的跳转</a>）：</p>
<blockquote><p>package com.easymorse;
<p>import java.io.BufferedReader;<br />import java.io.InputStreamReader;
<p>import org.apache.http.HttpResponse;<br />import org.apache.http.client.HttpClient;<br />import org.apache.http.client.methods.HttpGet;<br />import org.apache.http.impl.client.DefaultHttpClient;
<p>import android.app.Activity;<br />import android.os.Bundle;<br />import android.util.Log;<br />import android.widget.TextView;
<p>import com.thoughtworks.xstream.XStream;
<p>public class NextActivity extends Activity {<br />&nbsp;&nbsp;&nbsp; private TextView textView;<br />&nbsp;&nbsp;&nbsp; @Override<br />&nbsp;&nbsp;&nbsp; protected void onCreate(Bundle savedInstanceState) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.onCreate(savedInstanceState);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setContentView(R.layout.next_activity);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.textView=(TextView) this.findViewById(R.id.TextView01);
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpClient client = new DefaultHttpClient();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuilder builder = new StringBuilder();
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpGet get = new HttpGet(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; “<a href="http://marshal.easymorse.com/wp-content/uploads/2009/10/product2.xml&quot;);">http://marshal.easymorse.com/wp-content/uploads/2009/10/product2.xml”);</a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpResponse response = client.execute(get);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedReader reader = new BufferedReader(new InputStreamReader(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.getEntity().getContent()));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (String s = reader.readLine(); s != null; s = reader.readLine()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; builder.append(s);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log.v(“response”,”product:”+builder.toString());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XStream xstream = new XStream();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xstream.alias(“product”, Product.class);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Product product=(Product) xstream.fromXML(builder.toString());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.textView.setText(product.toString());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />}</p>
</blockquote>
<p>执行NextActivity的截图：</p>
<p><a rel="lightbox" href="http://marshal.easymorse.com/wp-content/uploads/2009/10/image21.png"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2009/10/image_thumb18.png" width="287" height="149"></a></p>
<p>从服务器端返回的中文内容能够正确解码。不过，如果通过eclipse插件中的ddms日志，看到的是乱码，估计和日志或者eclipse插件默认字符集有关 。</p>
<p><a rel="lightbox" href="http://marshal.easymorse.com/wp-content/uploads/2009/10/image22.png"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2009/10/image_thumb19.png" width="452" height="128"></a> </p>
<p>另外，想要使用xstream需要引入xstream包。具体方法见：<a href="http://marshal.easymorse.com/archives/1713" title="在eclipse的android项目中引入第三方包">在eclipse的android项目中引入第三方包</a>。在这里xstream又依赖xpp3用于对xml解析。xpp3的网址：</p>
<blockquote><p><a href="http://www.extreme.indiana.edu/xgws/xsoap/xpp/">http://www.extreme.indiana.edu/xgws/xsoap/xpp/</a></p>
</blockquote>
<p>可以在这里下载到最新的xpp3分发包：</p>
<blockquote><p><a href="http://www.extreme.indiana.edu/dist/java-repository/xpp3/distributions/">http://www.extreme.indiana.edu/dist/java-repository/xpp3/distributions/</a></p>
</blockquote>
<p>然后解压缩，将其中的xpp3_min-*.jar导入项目即可。</p>
<p>或者也可以选择不依赖xpp3包，这样可以节省24K左右的空间。需要实例化XStream时:</p>
<blockquote><p>XStream xstream = new XStream(new DomDriver());</p>
</blockquote>
<p>另外，日期格式用：</p>
<blockquote><p>2009-10-27 00:00:00.0 CST</p>
</blockquote>
<p>是为了直接转型方面，如果比较复杂，需要实现xstream的转型接口做定制实现：</p>
<blockquote><p><a href="http://xstream.codehaus.org/converter-tutorial.html">http://xstream.codehaus.org/converter-tutorial.html</a></p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/1715/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>groovy生成xml</title>
		<link>http://marshal.easymorse.com/archives/1377?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=groovy%25e7%2594%259f%25e6%2588%2590xml</link>
		<comments>http://marshal.easymorse.com/archives/1377#comments</comments>
		<pubDate>Fri, 26 Jun 2009 06:40:32 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/archives/1377</guid>
		<description><![CDATA[当前做的项目，返回的结果是xml数据。上一个版本用freemarker做的，因为显示逻辑比较多，freemarker模版十分混乱。模版和数据分离在两个文件中（数据在java文件中），维护和增加新内容也比较麻烦。 这个版本改为用groovy生成xml，数据和表现逻辑在一个文件中，而且groovy文本中加入变量和生成xml都十分方便。整个代码变得很简明。 需要用到的是groovy包中提供的xml构建类：groovy.xml.MarkupBuilder。以下是一个实例： import groovy.xml.MarkupBuilder def params=[:] def address=1066987654321 params.smsItems=['123','223','323'] params.wapItms=['http://wap.mycompony.com/bz.php?id=23'] def out=new StringWriter() def xmlResults=new MarkupBuilder(out) xmlResults.messages{ if(params.smsItems.isEmpty()){ message 'sms have no data.' }else{ sms(address:address){ params.smsItems.each{ content it } } } wap{ params.wapItms.each{ url it } } } println out 将产生如下结果： &#60;messages&#62; &#60;sms address='1066987654321'&#62; &#60;content&#62;123&#60;/content&#62; &#60;content&#62;223&#60;/content&#62; &#60;content&#62;323&#60;/content&#62; &#60;/sms&#62; &#60;wap&#62; &#60;url&#62;http://wap.mycompony.com/bz.php?id=23&#60;/url&#62; &#60;/wap&#62; &#60;/messages&#62;]]></description>
			<content:encoded><![CDATA[<p>当前做的项目，返回的结果是xml数据。上一个版本用freemarker做的，因为显示逻辑比较多，freemarker模版十分混乱。模版和数据分离在两个文件中（数据在java文件中），维护和增加新内容也比较麻烦。</p>
<p>这个版本改为用groovy生成xml，数据和表现逻辑在一个文件中，而且groovy文本中加入变量和生成xml都十分方便。整个代码变得很简明。</p>
<p><span id="more-1377"></span>
<p>需要用到的是groovy包中提供的xml构建类：groovy.xml.MarkupBuilder。以下是一个实例：</p>
</p>
<div class="wlWriterSmartContent" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:53d7357f-244b-4ab6-95f3-1046acd4619d" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre  style="width:100%;;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #0000FF;">import</span><span style="color: #000000;"> groovy.xml.MarkupBuilder

def params</span><span style="color: #000000;">=</span><span style="color: #000000;">[:]
def address</span><span style="color: #000000;">=</span><span style="color: #000000;">1066987654321</span><span style="color: #000000;">

params.smsItems</span><span style="color: #000000;">=</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">123</span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;">'</span><span style="color: #000000;">223</span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;">'</span><span style="color: #000000;">323</span><span style="color: #000000;">'</span><span style="color: #000000;">]
params.wapItms</span><span style="color: #000000;">=</span><span style="color: #000000;">[</span><span style="color: #000000;">'</span><span style="color: #000000;">http://wap.mycompony.com/bz.php?id=23</span><span style="color: #000000;">'</span><span style="color: #000000;">]

def out</span><span style="color: #000000;">=</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> StringWriter()
def xmlResults</span><span style="color: #000000;">=</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> MarkupBuilder(out)

xmlResults.messages{
    </span><span style="color: #0000FF;">if</span><span style="color: #000000;">(params.smsItems.isEmpty()){
        message </span><span style="color: #000000;">'</span><span style="color: #000000;">sms have no data.</span><span style="color: #000000;">'</span><span style="color: #000000;">
    }</span><span style="color: #0000FF;">else</span><span style="color: #000000;">{
        sms(address:address){
            params.smsItems.each{
                content it
            }
         }
    }
    wap{
        params.wapItms.each{
            url it
        }
    }
}

println out</span></div>
</pre>
</div>
<p>将产生如下结果：</p>
<div class="wlWriterSmartContent" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:28dfe3fc-4d2c-4384-b265-485d9105c065" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre  style="width:100%;;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">messages</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
  </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">sms </span><span style="color: #FF0000;">address</span><span style="color: #0000FF;">='1066987654321'</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">content</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">123</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">content</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">content</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">223</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">content</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">content</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">323</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">content</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
  </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">sms</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
  </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">wap</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">url</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">http://wap.mycompony.com/bz.php?id=23</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">url</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
  </span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">wap</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">
</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">messages</span><span style="color: #0000FF;">&gt;</span></div>
</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/1377/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

