<?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>taichino.com &#187; xml</title>
	<atom:link href="http://taichino.com/tag/xml/feed" rel="self" type="application/rss+xml" />
	<link>http://taichino.com</link>
	<description>永遠のネバーランド</description>
	<lastBuildDate>Sat, 04 Feb 2012 13:33:04 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>PythonでXMLの検証を行いたい件</title>
		<link>http://taichino.com/programming/1692</link>
		<comments>http://taichino.com/programming/1692#comments</comments>
		<pubDate>Fri, 02 Apr 2010 00:00:01 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[lxml]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=1692</guid>
		<description><![CDATA[自前で出力したsitemap.xmlがgoogleにはじかれたので、XMLスキーマの検証処理をPythonでもやりたいなぁと思って調べてみたら、簡単に出来ました。さすがPythonということでメモ書きです。 lxmlを使うのですが、インストールはコチラを参考に行いました。ありがとうございます。処理手順は非常に簡単で、以下のような感じになります。etree.parseにファイル(ライク)オブジェクトを食わせるのがちょっと注意が必要ですが、それ以外は非常に簡単ですね。要はスキーマオブジェクトを作って、検証したいXMLのDOMを食わせればOKです。 def validate&#40;schema, xml&#41;: schema_doc = etree.parse&#40;schema&#41; xml_doc = etree.parse&#40;xml&#41; xmlschema = etree.XMLSchema&#40;schema_doc&#41; if xmlschema.validate&#40;xml_doc&#41;: return True else: raise &#34;E: %s&#34; % &#40;str&#40;xmlschema.error_log.last_error&#41;&#41; 検証に失敗した際のエラーはXML Schemaを利用した場合はerror_logを使います。結構しっかりとしたエラーメッセージを出してくれるので、十分バリデータとして使えると思いました。上記メソッドを使って以下のように使います。 print validate&#40;open&#40;'sitemap.xsd', 'r'&#41;, # スキーマと open&#40;'sitemap.xml', 'r'&#41;&#41; # 検証対象XMLをファイル(ライク)オブジェクトとして渡す 今回はXMLSchemaを使いましたがDTDやRelaxも同じように扱えます。詳細はlxmlのドキュメントを見て下さいませ。何となくラッパーモジュールが存在してそうな気がしますが、今はこれで十分なので探していません。 これ書いててXML久々に触ったなぁと思いました。数年前はXMLを妄信していて何でもXMLで処理しようとしていましたが、今は完全にJSONに改宗していて、XMLは使いたくないデータ表現に成り下がってしまいました。思い返すとXMLが一番美しい！とか痛い発言を繰り返していたので恥ずかしいです。どうでもいいですね。]]></description>
			<content:encoded><![CDATA[<p>自前で出力したsitemap.xmlがgoogleにはじかれたので、XMLスキーマの検証処理をPythonでもやりたいなぁと思って調べてみたら、簡単に出来ました。さすがPythonということでメモ書きです。</p>
<p><span id="more-1692"></span></p>
<p><a href="http://codespeak.net/lxml/index.html">lxml</a>を使うのですが、インストールは<a href="http://d.hatena.ne.jp/ymotongpoo/20090203/1233674446">コチラ</a>を参考に行いました。ありがとうございます。処理手順は非常に簡単で、以下のような感じになります。etree.parseにファイル(ライク)オブジェクトを食わせるのがちょっと注意が必要ですが、それ以外は非常に簡単ですね。要はスキーマオブジェクトを作って、検証したいXMLのDOMを食わせればOKです。</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> validate<span style="color: black;">&#40;</span>schema, <span style="color: #dc143c;">xml</span><span style="color: black;">&#41;</span>:
  schema_doc = etree.<span style="color: black;">parse</span><span style="color: black;">&#40;</span>schema<span style="color: black;">&#41;</span>
  xml_doc    = etree.<span style="color: black;">parse</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">xml</span><span style="color: black;">&#41;</span>
  xmlschema  = etree.<span style="color: black;">XMLSchema</span><span style="color: black;">&#40;</span>schema_doc<span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">if</span> xmlschema.<span style="color: black;">validate</span><span style="color: black;">&#40;</span>xml_doc<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
  <span style="color: #ff7700;font-weight:bold;">else</span>:
    <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #483d8b;">&quot;E: %s&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span><span style="color: #008000;">str</span><span style="color: black;">&#40;</span>xmlschema.<span style="color: black;">error_log</span>.<span style="color: black;">last_error</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>検証に失敗した際のエラーはXML Schemaを利用した場合はerror_logを使います。結構しっかりとしたエラーメッセージを出してくれるので、十分バリデータとして使えると思いました。上記メソッドを使って以下のように使います。</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">  <span style="color: #ff7700;font-weight:bold;">print</span> validate<span style="color: black;">&#40;</span><span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'sitemap.xsd'</span>, <span style="color: #483d8b;">'r'</span><span style="color: black;">&#41;</span>,   <span style="color: #808080; font-style: italic;"># スキーマと</span>
                 <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'sitemap.xml'</span>, <span style="color: #483d8b;">'r'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>   <span style="color: #808080; font-style: italic;"># 検証対象XMLをファイル(ライク)オブジェクトとして渡す</span></pre></div></div>

<p>今回はXMLSchemaを使いましたがDTDやRelaxも同じように扱えます。詳細は<a href="http://codespeak.net/lxml/validation.html">lxmlのドキュメント</a>を見て下さいませ。何となくラッパーモジュールが存在してそうな気がしますが、今はこれで十分なので探していません。</p>
<p>これ書いててXML久々に触ったなぁと思いました。数年前はXMLを妄信していて何でもXMLで処理しようとしていましたが、今は完全にJSONに改宗していて、XMLは使いたくないデータ表現に成り下がってしまいました。思い返すとXMLが一番美しい！とか痛い発言を繰り返していたので恥ずかしいです。どうでもいいですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/1692/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>XML::Simpleっぽいpythonモジュール書いた</title>
		<link>http://taichino.com/programming/1516</link>
		<comments>http://taichino.com/programming/1516#comments</comments>
		<pubDate>Wed, 03 Feb 2010 17:14:18 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[pyxml2obj]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=1516</guid>
		<description><![CDATA[Yahooの形態素解析APIを使おうと思ったら、XML形式しか対応してなかったので、Perlで言うところのXML::Simpleなpythonモジュールを探したのですが見つかりませんでした。XML::SimpleはXMLとPerlのハッシュ(と配列の混合オブジェクト)を相互に変換するモジュールで、ちょっとしたXMLの処理をするには非常に便利なので残念です。普通にDOMを弄っても良かったのですが、Python クックブックにベースとなるコードを見つけた事もあり、勢いでXML::Simpleを(中途半端に)移植してみました。 モジュール名はpyxml2objでXML::Simpleと同様にXMLinとXMLoutを実装してあります。このモジュールを使うと以下の様な感じで、XMLとpyhtonの辞書(とリストの混合オブジェクト)を相互変換できます。 from pyxml2obj import XMLin, XMLout xml = &#34;&#34;&#34; &#60;config logdir=&#34;/var/log/foo/&#34; debugfile=&#34;/tmp/foo.debug&#34;&#62; &#60;server name=&#34;sahara&#34; osname=&#34;solaris&#34; osversion=&#34;2.6&#34;&#62; &#60;address&#62;10.0.0.101&#60;/address&#62; &#60;address&#62;10.0.1.101&#60;/address&#62; &#60;/server&#62; &#60;server name=&#34;gobi&#34; osname=&#34;irix&#34; osversion=&#34;6.5&#34;&#62; &#60;address&#62;10.0.0.102&#60;/address&#62; &#60;/server&#62; &#60;server name=&#34;kalahari&#34; osname=&#34;linux&#34; osversion=&#34;2.0.34&#34;&#62; &#60;address&#62;10.0.0.103&#60;/address&#62; &#60;address&#62;10.0.1.103&#60;/address&#62; &#60;/server&#62; &#60;/config&#62; &#34;&#34;&#34; obj = XMLin&#40;xml&#41; # xml to object print obj # 以下出力を整形 # {u'debugfile': u'/tmp/foo.debug', u'logdir': u'/var/log/foo/', # u'server': { [...]]]></description>
			<content:encoded><![CDATA[<p>Yahooの形態素解析APIを使おうと思ったら、XML形式しか対応してなかったので、Perlで言うところの<a href="http://search.cpan.org/~grantm/XML-Simple-2.18/lib/XML/Simple.pm">XML::Simple</a>なpythonモジュールを探したのですが見つかりませんでした。XML::SimpleはXMLとPerlのハッシュ(と配列の混合オブジェクト)を相互に変換するモジュールで、ちょっとしたXMLの処理をするには非常に便利なので残念です。普通にDOMを弄っても良かったのですが、<a href="http://www.amazon.co.jp/gp/product/4873112761?ie=UTF8&#038;tag=taichino-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4873112761">Python クックブック</a><img src="http://www.assoc-amazon.jp/e/ir?t=taichino-22&#038;l=as2&#038;o=9&#038;a=4873112761" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />にベースとなるコードを見つけた事もあり、勢いでXML::Simpleを(中途半端に)移植してみました。</p>
<p><span id="more-1516"></span></p>
<p>モジュール名はpyxml2objでXML::Simpleと同様にXMLinとXMLoutを実装してあります。このモジュールを使うと以下の様な感じで、XMLとpyhtonの辞書(とリストの混合オブジェクト)を相互変換できます。</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> pyxml2obj <span style="color: #ff7700;font-weight:bold;">import</span> XMLin, XMLout
<span style="color: #dc143c;">xml</span> = <span style="color: #483d8b;">&quot;&quot;&quot;
&lt;config logdir=&quot;/var/log/foo/&quot; debugfile=&quot;/tmp/foo.debug&quot;&gt;
    &lt;server name=&quot;sahara&quot; osname=&quot;solaris&quot; osversion=&quot;2.6&quot;&gt;
      &lt;address&gt;10.0.0.101&lt;/address&gt;
      &lt;address&gt;10.0.1.101&lt;/address&gt;
    &lt;/server&gt;
    &lt;server name=&quot;gobi&quot; osname=&quot;irix&quot; osversion=&quot;6.5&quot;&gt;
      &lt;address&gt;10.0.0.102&lt;/address&gt;
    &lt;/server&gt;
    &lt;server name=&quot;kalahari&quot; osname=&quot;linux&quot; osversion=&quot;2.0.34&quot;&gt;
      &lt;address&gt;10.0.0.103&lt;/address&gt;
      &lt;address&gt;10.0.1.103&lt;/address&gt;
    &lt;/server&gt;
&lt;/config&gt;
&quot;&quot;&quot;</span>
obj = XMLin<span style="color: black;">&#40;</span><span style="color: #dc143c;">xml</span><span style="color: black;">&#41;</span>   <span style="color: #808080; font-style: italic;"># xml to object</span>
<span style="color: #ff7700;font-weight:bold;">print</span> obj
<span style="color: #808080; font-style: italic;"># 以下出力を整形</span>
<span style="color: #808080; font-style: italic;"># {u'debugfile': u'/tmp/foo.debug', u'logdir': u'/var/log/foo/',</span>
<span style="color: #808080; font-style: italic;">#     u'server': {</span>
<span style="color: #808080; font-style: italic;">#	    u'gobi':     {u'osversion': u'6.5', u'address': u'10.0.0.102', u'osname': u'irix'},</span>
<span style="color: #808080; font-style: italic;">#	    u'kalahari': {u'osversion': u'2.0.34', u'address': [u'10.0.0.103', u'10.0.1.103'], u'osname': u'linux'},</span>
<span style="color: #808080; font-style: italic;">#	    u'sahara':   {u'osversion': u'2.6', u'address': [u'10.0.0.101', u'10.0.1.101'], u'osname': u'solaris'}}}</span>
&nbsp;
dic = <span style="color: black;">&#123;</span> <span style="color: #483d8b;">'country'</span> : <span style="color: black;">&#123;</span>
      <span style="color: #483d8b;">'England'</span> : <span style="color: black;">&#123;</span> <span style="color: #483d8b;">'capital'</span> : <span style="color: #483d8b;">'London'</span> <span style="color: black;">&#125;</span>,
      <span style="color: #483d8b;">'France'</span>  : <span style="color: black;">&#123;</span> <span style="color: #483d8b;">'capital'</span> : <span style="color: #483d8b;">'Paris'</span> <span style="color: black;">&#125;</span>,
      <span style="color: #483d8b;">'Turkey'</span>  : <span style="color: black;">&#123;</span> <span style="color: #483d8b;">'capital'</span> : <span style="color: #483d8b;">'Istanbul'</span> <span style="color: black;">&#125;</span>,
      <span style="color: black;">&#125;</span><span style="color: black;">&#125;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> XMLout<span style="color: black;">&#40;</span>dic<span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># object to xml</span>
<span style="color: #808080; font-style: italic;"># 以下出力そのまま</span>
<span style="color: #808080; font-style: italic;"># &lt;root&gt;</span>
<span style="color: #808080; font-style: italic;">#   &lt;country capital=&quot;Istanbul&quot; name=&quot;Turkey&quot; /&gt;</span>
<span style="color: #808080; font-style: italic;">#   &lt;country capital=&quot;London&quot; name=&quot;England&quot; /&gt;</span>
<span style="color: #808080; font-style: italic;">#   &lt;country capital=&quot;Paris&quot; name=&quot;France&quot; /&gt;</span>
<span style="color: #808080; font-style: italic;"># &lt;/root&gt;</span></pre></div></div>

<p>内部ではxml.saxモジュールを使ってXMLのパースを行っています。これで非常に簡単にXMLを扱えるようになりましたね。最初は半日くらいで出来るかと思ったのですが、テスト等で手間取って結局丸まる３日かかりまして、壮大なヤクの毛刈りになってしまいました。。</p>
<p>なお今回も調子に乗ってpypiに登録したのでインストールはeasy_installから。ソースは<a href="http://github.com/taichino/pyxml2obj">github</a>から。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ easy_install pyxml2obj</pre></div></div>

<p>本当はpyxmlsimpleという名前にしたかったのですが、既に使われていたので適当につけました。</p>
<p>あと最初に中途半端にと書きましたが、オプション対応が面倒だったので、あんまり使わなさそうなのは、ごっそり消しました。ごめんなさい。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/1516/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DomDocument::loadXMLでエンコードの設定が消える件</title>
		<link>http://taichino.com/programming/465</link>
		<comments>http://taichino.com/programming/465#comments</comments>
		<pubDate>Wed, 24 Jun 2009 09:12:30 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=465</guid>
		<description><![CDATA[さっきのjson2xmlで、phpのDomDocumentのloadXMLにハマりました。 以下がはまったサンプルコードと出力になります。 &#60; ?php $dom = new DomDocument&#40;'1.0', 'utf-8'&#41;; $dom-&#62;loadXML&#40;&#34;&#60;root&#62;&#60;name&#62;taichino&#60; /name&#62;&#60;age&#62;25&#60;/age&#62;&#60;/name&#62;&#60;/root&#62;&#34;&#41;; $dom-&#62;formatOutput = true; echo $dom-&#62;saveXML&#40;&#41;; ?&#62; &#60;!-- 期待する出力 --&#62; &#60; ?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34; ?&#62; &#60;root&#62; &#60;name&#62;taichino&#60;/name&#62; &#60;age&#62;25&#60;/age&#62; &#60;/root&#62; &#160; &#60;!-- 実際の出力 --&#62; &#60; ?xml version=&#34;1.0&#34; ?&#62; &#60;root&#62; &#60;name&#62;taichino&#60;/name&#62; &#60;age&#62;25&#60;/age&#62; &#60;/root&#62; 何故かエンコーディングの設定が消えてしまいます。環境の問題だと思い込んで、phpinfoやらphp.iniやら色々確認してみたものの何が原因か解りません。 そこで念の為以下のコードを走らせると正常の挙動を示しました。 $dom = new DomDocument&#40;'1.0', 'utf-8'&#41;; echo $dom-&#62;saveXML&#40;&#41;; &#60;!-- ヘッダだけだと正常に出力される --&#62; &#60; ?xml [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://taichino.com/?p=443">さっきのjson2xml</a>で、phpのDomDocumentのloadXMLにハマりました。</p>
<p><span id="more-465"></span></p>
<p>以下がはまったサンプルコードと出力になります。</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ?php
<span style="color: #000088;">$dom</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DomDocument<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'1.0'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'utf-8'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$dom</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">loadXML</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&lt;root&gt;&lt;name&gt;taichino&lt; /name&gt;&lt;age&gt;25&lt;/age&gt;&lt;/name&gt;&lt;/root&gt;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$dom</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">formatOutput</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$dom</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">saveXML</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">&lt;!-- 期待する出力 --&gt;</span>
<span style="color: #009900;">&lt; ?xml <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;utf-8&quot;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;root<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>taichino<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;age<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>25<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/age<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/root<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #808080; font-style: italic;">&lt;!-- 実際の出力 --&gt;</span>
<span style="color: #009900;">&lt; ?xml <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;root<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>taichino<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;age<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>25<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/age<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/root<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>何故かエンコーディングの設定が消えてしまいます。環境の問題だと思い込んで、phpinfoやらphp.iniやら色々確認してみたものの何が原因か解りません。</p>
<p>そこで念の為以下のコードを走らせると正常の挙動を示しました。</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$dom</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DomDocument<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'1.0'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'utf-8'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$dom</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">saveXML</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">&lt;!-- ヘッダだけだと正常に出力される --&gt;</span>
<span style="color: #009900;">&lt; ?xml <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;utf-8&quot;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></span></pre></div></div>

<p>まさかと思いましたが、結局loadXML後にencodingを指定したら動きました。<br />
コンストラクタでパラメータ設定できないので、loadXMLを静的呼出に合わせて変更するのが正解でしょうか。</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ?php
<span style="color: #000088;">$dom</span> <span style="color: #339933;">=</span> DomDocument<span style="color: #339933;">::</span><span style="color: #004000;">loadXML</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&lt;root&gt;&lt;name&gt;taichino&lt; /name&gt;&lt;age&gt;25&lt; /age&gt;&lt; /root&gt;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$dom</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">encoding</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'utf-8'</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// ロードしてからエンコーディング設定。釈然としないけども。。</span>
<span style="color: #000088;">$dom</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">formatOutput</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$dom</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">saveXML</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #339933;">&lt;/</span>age<span style="color: #339933;">&gt;&lt;/</span>name<span style="color: #339933;">&gt;</span></pre></div></div>

<p>今回ハマった理由は<a href="http://php.benscom.com/manual/ja/domdocument.loadxml.php">phpマニュアルのloadXMLの説明</a>に以下の記述があったからです。</p>
<blockquote><p>このメソッドをスタティックにコールすると、読み込んだ内容をもとに DOMDocument オブジェクトを作成します。読み込み前に DOMDocument のプロパティを 設定する必要がない場合に、スタティックに実行することがあるでしょう。
</p></blockquote>
<p>いやいや、コレは読み込み前にプロパティ設定できるって思いますやん。マニュアルに騙された！</p>
<p>というわけで何が正しいか常に意識しながら生きていかねばなりません。思い込みで選択肢を消してはなりませぬ！</p>
<p>試したのはphp5.1.6と5.2.8です。既になおってたらごめんなさい。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/465/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>phpでjson2xml</title>
		<link>http://taichino.com/programming/443</link>
		<comments>http://taichino.com/programming/443#comments</comments>
		<pubDate>Wed, 24 Jun 2009 06:03:03 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=443</guid>
		<description><![CDATA[phpでjsonからxmlに変換したかったのですが、何故かちょっと調べた感じで出てこなかったので書いてみました。でもJSONの仕様をあんまり把握してないので、間違ってたらすいません。 &#60; ?php require_once&#40;'XML/Util.php'&#41;; &#160; /** * @param $obj 変換する連想配列 * @param $root 補完するルートタグ * @param $encoding 出力するXMLのエンコーディング * @return DOMオブジェクト */ function json2xml&#40;$obj, $root=null, $encoding=&#34;&#34;&#41; &#123; $body = $root ? _tag&#40;$root, _json2xml&#40;$obj, $encoding&#41;&#41; : _json2xml&#40;$obj, $encoding&#41;; $dom = DomDocument::loadXML&#40;$body&#41;; if &#40;$encoding&#41; $dom-&#62;encoding = $encoding; return $dom; &#125; &#160; function _json2xml&#40;$obj, $encoding=&#34;&#34;&#41; &#123; $result = [...]]]></description>
			<content:encoded><![CDATA[<p>phpでjsonからxmlに変換したかったのですが、何故かちょっと調べた感じで出てこなかったので書いてみました。でもJSONの仕様をあんまり把握してないので、間違ってたらすいません。</p>
<p><span id="more-443"></span></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ?php
<span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'XML/Util.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * @param $obj      変換する連想配列
 * @param $root     補完するルートタグ
 * @param $encoding 出力するXMLのエンコーディング
 * @return          DOMオブジェクト
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> json2xml<span style="color: #009900;">&#40;</span><span style="color: #000088;">$obj</span><span style="color: #339933;">,</span> <span style="color: #000088;">$root</span><span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #000088;">$encoding</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$body</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$root</span> ? _tag<span style="color: #009900;">&#40;</span><span style="color: #000088;">$root</span><span style="color: #339933;">,</span> _json2xml<span style="color: #009900;">&#40;</span><span style="color: #000088;">$obj</span><span style="color: #339933;">,</span> <span style="color: #000088;">$encoding</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> _json2xml<span style="color: #009900;">&#40;</span><span style="color: #000088;">$obj</span><span style="color: #339933;">,</span> <span style="color: #000088;">$encoding</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$dom</span>  <span style="color: #339933;">=</span> DomDocument<span style="color: #339933;">::</span><span style="color: #004000;">loadXML</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$body</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$encoding</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$dom</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">encoding</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$encoding</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #000088;">$dom</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> _json2xml<span style="color: #009900;">&#40;</span><span style="color: #000088;">$obj</span><span style="color: #339933;">,</span> <span style="color: #000088;">$encoding</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">list</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #000088;">$val</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">each</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$obj</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$tagName</span> <span style="color: #339933;">=</span> <span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/^\d+$/'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span> ? <span style="color: #0000ff;">'array_item'</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$key</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">gettype</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$val</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">case</span> <span style="color: #0000ff;">&quot;object&quot;</span><span style="color: #339933;">:</span>
    <span style="color: #b1b100;">case</span> <span style="color: #0000ff;">&quot;array&quot;</span><span style="color: #339933;">:</span>
      <span style="color: #000088;">$result</span> <span style="color: #339933;">.=</span> _tag<span style="color: #009900;">&#40;</span><span style="color: #000088;">$tagName</span><span style="color: #339933;">,</span> _json2xml<span style="color: #009900;">&#40;</span><span style="color: #000088;">$val</span><span style="color: #339933;">,</span> <span style="color: #000088;">$encoding</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">default</span><span style="color: #339933;">:</span>
<span style="color: #666666; font-style: italic;">#      $result .= _tag($tagName, htmlentities($val, ENT_QUOTES, $encoding));
</span>      <span style="color: #000088;">$result</span> <span style="color: #339933;">.=</span> _tag<span style="color: #009900;">&#40;</span><span style="color: #000088;">$tagName</span><span style="color: #339933;">,</span> XML_Util<span style="color: #339933;">::</span><span style="color: #004000;">replaceEntities</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$val</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #b1b100;">return</span> <span style="color: #000088;">$result</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> _tag<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #339933;">,</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">&quot;&lt; <span style="color: #006699; font-weight: bold;">$name</span>&gt;<span style="color: #006699; font-weight: bold;">$value</span> &lt; /<span style="color: #006699; font-weight: bold;">$name</span>&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>使い方はこんな感じでしょうか。<br />
jsonっていうか、連想配列がxmlになるのは良いですね。</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ?php
<span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'json2xml.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$obj</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
  <span style="color: #0000ff;">&quot;name&quot;</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;taichino &quot;</span><span style="color: #339933;">,</span>
  <span style="color: #0000ff;">&quot;yomi&quot;</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;たいちーの&quot;</span><span style="color: #339933;">,</span>
  <span style="color: #0000ff;">&quot;age&quot;</span>   <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">25</span><span style="color: #339933;">,</span>
  <span style="color: #0000ff;">&quot;skill&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
               <span style="color: #0000ff;">&quot;php&quot;</span>    <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">,</span>
               <span style="color: #0000ff;">&quot;perl&quot;</span>   <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span>
               <span style="color: #0000ff;">&quot;python&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
  <span style="color: #0000ff;">&quot;favorite&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;carbon emacs&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;tramp&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;cent os&quot;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$dom</span> <span style="color: #339933;">=</span> json2xml<span style="color: #009900;">&#40;</span><span style="color: #000088;">$obj</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'root'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;utf-8&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$dom</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">formatOutput</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$dom</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">saveXML</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p><strong>[追記]2009/06/24</strong><br />
encodeの受け渡しが出来ておらず、日本語を上手く処理できてなかったので、修正しました。本文修正済みです。</p>
<p><strong>[追記]2009/06/29</strong><br />
文字参照の置換にhtmlentitiesを使用していましたが、標準でDomDocumentが対応していない文字まで置換されて、その結果エラーが発生していましたので、XML_Util::replaceEntitiesを用いた置換に修正しました。本文修正済みです。コメント化して元のコードは残してあります。修正に伴い、pearパッケージの<a href="http://pear.php.net/package/XML_Util">XML_Util</a>のインストールが必要になりました。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/443/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

