ラベル XML の投稿を表示しています。 すべての投稿を表示
ラベル XML の投稿を表示しています。 すべての投稿を表示

2012年12月4日

XML ファイルから PO ファイル を作成する

概要

XML ファイルを翻訳することがそれなりの頻度である。翻訳するなら PO ファイルを生成するのが便利。
XML から PO ファイルを生成するには「xml2po」か、「ITS Tool」を使う。両方ともGnomeのドキュメント国際化でも使われている Python で作成されたツール。
両方とも XML から PO を生成したり、PO から XML に戻したりできる。
ITS Tool の方が新しい。

xml2po

sudo port install gnome-doc-utils
xml2po --version

POファイルの作成と、XMLへの戻しは以下のようにする。

xml2po -o sample.pot sample.xml
cp sample.pot ja.po
mkdir ja
xml2po -p ja.po sample.xml > ja/sample.xml

ITS Tool

# 依存ライブラリインストール
pip install ftp://xmlsoft.org/libxml2/python/libxml2-python-2.6.21.tar.gz
# ダウンロード
curl -O http://files.itstool.org/itstool/itstool-1.2.0.tar.bz2
tar xvfz itstool-1.2.0.tar.bz2
cd itstool-1.2.0
./configure
sudo make install
# バージョン確認
itstool --version

POファイルの作成と、XMLへの戻しは以下のようにする。

itstool sample.xml -o sample.pot
cp sample.pot ja.po
msgfmt -o ja.mo ja.po
mkdir ja
itstool -m ja.mo -o ja/ sample.xml

まとめ

翻訳対象の XML にもよるだろうが、自分は xml2po の方を普段は利用している。

2012年9月6日

pyquery で XML の namespace を扱う

概要

pyquery は XML を JQuery のように処理するこができる。
XML の namespace も処理することができる。

処理するXML

pypi は 各パッケージに DOAP(Description of a Project) が提供されているので、サンプルとしてこれを処理する。
pyquery 1.2.1 の DOAP は http://pypi.python.org/pypi?:action=doap&name=pyquery&version=1.2.1になる。

DOAP の形式確認

DOAP は RDF で、pypi の DOAP は以下のような形式になっている。

<?xml version="1.0" encoding="UTF-8" ?>
<rdf:RDF xmlns="http://usefulinc.com/ns/doap#"
         xmlns:foaf="http://xmlns.com/foaf/0.1/"
         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<Project>
<name></name>
<shortdesc></shortdesc>
<description></description>
<homepage></<homepage>
<maintainer>
<foaf:Person>
<foaf:name></foaf:name>
<foaf:mbox_sha1sum></foaf:mbox_sha1sum>
</foaf:Person>
</maintainer>
<release><Version><revision></revision></Version></release>
</Project></rdf:RDF>

サンプル

revisionの中身を取るには以下のようにする。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pyquery import PyQuery as pq


def main():
    url = 'http://pypi.python.org/pypi?:action=doap&name=pyquery&version=1.2.1'

    # namespace
    namespaces = {"ns": "http://usefulinc.com/ns/doap#"}
    # pyquery
    query = pq(url, parser='xml')

    # revision の取得
    revision = query('ns|revision',
                     namespaces=namespaces).text()

    print revision


if __name__ == '__main__':
    main()

どうやって調べるのか

Python 系のパッケージはだいたいテストソースが付いている。
pyquery のテストソースには namespace の処理例が書いてある。
namespace の処理以外にも pyquery で可能な処理がほとんど書いてあるので、テストソースを読むと大体の事は解決する。