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

2009年1月28日水曜日

XMLを扱う (その8) [Atom]

実際のAtom feedをみてみる。

$ curl http://aka-cs-blog.blogspot.com/feeds/posts/default > aka-feed.atom

中をみてみると。

  • 改行が無い。(そりゃそうだ。帯域大事)
  • ファイル容量がけっこう多い。(下の例ではエントリを一つだけにした。他は削除)
  • なんと、勝手拡張?なのか、OpenSearchと混ぜている。
  • さて、なんでfeedの中にOpenSearchがあるのかしら、と考えてみる。きっとこのfeedを作るのに検索を実施していることの副作用として入っているのだろう。
  • しかしこういう風に混ぜちゃうと妥当性検証もへったくれもないな、、、



<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?>
<feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'>
<id>tag:blogger.com,1999:blog-5289049604340113831</id>
<updated>2009-01-28T11:10:24.516+09:00</updated>
<title type='text'>計算機とその周辺</title>
<subtitle type='html'></subtitle>
<link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/posts/defau\
lt'/>
<link rel='self' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/posts/default'/>
<link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/'/>
<link rel='next' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/posts/default?start-index=26&max-results\
=25'/>
<author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</e\
mail></author>
<generator version='7.00' uri='http://www.blogger.com'>Blogger</generator>
<openSearch:totalResults>450</openSearch:totalResults>
<openSearch:startIndex>1</openSearch:startIndex>
<openSearch:itemsPerPage>25</openSearch:itemsPerPage>
<entry>
<id>tag:blogger.com,1999:blog-5289049604340113831.post-2409689848169847100</id>
<published>2009-01-28T11:06:00.002+09:00</published>
<updated>2009-01-28T11:10:24.533+09:00</updated>
<app:edited xmlns:app='http://purl.org/atom/app#'>2009-01-28T11:10:24.533+09:00</app:edited>
<category scheme='http://www.blogger.com/atom/ns#' term='atom'/>
<category scheme='http://www.blogger.com/atom/ns#' term='xml'/>
<category scheme='http://www.blogger.com/atom/ns#' term='emacs'/>
<title type='text'>XMLを扱う (その7) [Atom]</title>
<content type='html'>Atomを例に名前空間の理解の確認を。<br /><pre><br /> Atomでは、xhtmlの要素も使える。&l\
t;br /><br /> それにはまずxhtmlの語彙を指定する。<br /><br /> ---<br /> namespace xhtml = \
"http://www.w3.org/1999/xhtml"<br /> ---<br /><br /> これで語彙は使えるようになるが、その語彙が母体たるAto\
mの中でどのよ<br /> うな構造の一部となるかは、AtomのSchemaの中で指定しなければならない。<br /><br /> それ\\
にはまず、xhtml:*の形の要素の定義が必要。<br /><br /> ---<br /> # XHTML<br /><br /> any\
XHTML = element xhtml:* {<br /> (attribute * { text }<br /> | text<br /> | anyXHTML)*<br /\
> }<br /><br /> xhtmlDiv = element xhtml:div {<br /> (attribute * { text }<br /> \
| text<br /> | anyXHTML)*<br /> }<br /> ---<br /><br /> それを母体の要素でど\
のように使えるかは次のように定義。<br /><br /> ---<br /> atomXHTMLTextConstruct =<br /> ato\
mCommonAttributes,<br /> attribute type { "xhtml" },<br /> xhtmlDiv<br /><br /> atomTextC\
onstruct = atomPlainTextConstruct | atomXHTMLTextConstruct<br /><br /> atomTitle = element atom:title { atomTextConstru\
ct }<br /> ---<br /><br /> これをatom上で利用するには次のよう。<br /><br /> ---<br /\
> ...<br /> &lt;title type="xhtml" xmlns:xhtml="http://www.w3.org/1999/xhtml"><br /> &lt;\
xhtml:div><br /> Less: &lt;xhtml:em> &lt; &lt;/xhtml:em><br /> &lt;/xhtml:div>\
<br /> &lt;/title><br /> ...<br /> &lt;summary type="xhtml"><br /> &am\
p;lt;div xmlns="http://www.w3.org/1999/xhtml"><br /> This is &lt;b>XHTML&lt;/b> content.<br /> \
&lt;/div><br /> &lt;/summary><br /> ...<br /> &lt;summary type="xhtml">&\
lt;br /> &lt;xh:div xmlns:xh="http://www.w3.org/1999/xhtml"><br /> This is &lt;xh:b>XHTML&l\
t;/xh:b> content.<br /> &lt;/xh:div><br /> &lt;/summary><br /> ...<br /> \
---<br /><br /> ふむ。理解に間違いはなさそうだ。<br /> それにしても、<br /><br /> \
anyXHTML = element xhtml:* ...<br /><br /> と書けるRelax NGって便利だなぁ。<br /></pre><br /><br \
/>なかなかCLに辿りつけないが、こつこつ。</content>
<link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/2409689848169847100/comments/default' t\
itle='コメントの投稿'/>
<link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5289049604340113831&postID=2409689848169847\
100' title='0 件のコメント'/>
<link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/24096898481698471\
00?v=2'/>
<link rel='self' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/posts/default/2409689848169847100'/>
<link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/01/xml-7-atom.html' title='XMLを扱う (その7) [Ato\
m]'/>
<author>
<name>aka</name>
<uri>http://www.blogger.com/profile/02301993913128404609</uri>
<email>noreply@blogger.com</email>
</author>
<thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total>
</entry>
</feed>


こつこつ。

XMLを扱う (その7) [Atom]

Atomを例に名前空間の理解の確認を。

Atomでは、xhtmlの要素も使える。

それにはまずxhtmlの語彙を指定する。

---
namespace xhtml = "http://www.w3.org/1999/xhtml"
---

これで語彙は使えるようになるが、その語彙が母体たるAtomの中でどのよ
うな構造の一部となるかは、AtomのSchemaの中で指定しなければならない。

それにはまず、xhtml:*の形の要素の定義が必要。

---
# XHTML

anyXHTML = element xhtml:* {
(attribute * { text }
| text
| anyXHTML)*
}

xhtmlDiv = element xhtml:div {
(attribute * { text }
| text
| anyXHTML)*
}
---

それを母体の要素でどのように使えるかは次のように定義。

---
atomXHTMLTextConstruct =
atomCommonAttributes,
attribute type { "xhtml" },
xhtmlDiv

atomTextConstruct = atomPlainTextConstruct | atomXHTMLTextConstruct

atomTitle = element atom:title { atomTextConstruct }
---

これをatom上で利用するには次のよう。

---
...
<title type="xhtml" xmlns:xhtml="http://www.w3.org/1999/xhtml">
<xhtml:div>
Less: <xhtml:em> < </xhtml:em>
</xhtml:div>
</title>
...
<summary type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
This is <b>XHTML</b> content.
</div>
</summary>
...
<summary type="xhtml">
<xh:div xmlns:xh="http://www.w3.org/1999/xhtml">
This is <xh:b>XHTML</xh:b> content.
</xh:div>
</summary>
...
---

ふむ。理解に間違いはなさそうだ。
それにしても、

anyXHTML = element xhtml:* ...

と書けるRelax NGって便利だなぁ。


なかなかCLに辿りつけないが、こつこつ。

XMLを扱う (その6) [Atom]


Atomを扱えるようにするワークフロー
----------------------------------

nxml-modeの配布にatomのrncが含まれているか確認。
含まれていない。

rfc4287からコピペで作成。
これは確立されたschemaなので、~/local/lib/schema/に置くことにする。
nxml-modeのschemaディレクトリには入れない。入れるとnxml-modeの更新
時の作業がややこしくなる。

rnc作成モードもあるようだが、今は使わない。将来やる。

コピペ完了。

中身をみるとSchematronを名前空間で参照している。
Schematronのrncは存在するのか?

http://xml.ascc.net/schematron/

には存在しない。

念のため上記URIから
Schematron schema
XML Schema schema
DTD schema

を取得する。とやってたら、

http://www.schematron.com/spec.html

を発見。

RELAX NG Comapact Syntax schema for ISO Schematron

だって。あるじゃん。

iso-schematron.rnc

を入手。~/local/lib/schema/に設置。

さて、rfcのrncのnamespaceが、

namespace atom = "http://www.w3.org/2005/Atom"

を含んでいるのがわからない。自分のことじゃないの??

http://relaxng.org/compact-tutorial-20030326.html

を確認する。

わかった。自分のことなのだ。

atom.rncにてelementを定義しているところはすべてatom:hogeになってい
る。で、atom:が付いていないシンボル?は、グラマーなどの名前につか
われている。感覚的に言うと、namespace atomの名前たちはexternalであ
り、namespace localの名前達はinternalという感じ。

もちろん、XML側での名前空間の利用時は、

<feed xmlns="http://www.w3.org/2005/Atom">

などとxmlnsをprefixなしで指定するから、atom:は不要である。

これで、rncは揃った。nxml-modeへの登録だ。

変数 rng-schema-locating-filesに
locating-filesに~/local/lib/schema/schemas.xmlを登録する。

(push "~/local/lib/schema/schemas.xml" rng-schema-locating-files)

そして、schemas.xmlはこんな感じ。

----
<locatingRules xmlns="http://thaiopensource.com/ns/locating-rules/1.0">
<uri pattern="*.atom" typeId="ATOM"/>
<uri pattern="*.sch" typeId="SCHEMATRON"/>

<namespace ns="http://www.w3.org/2005/Atom" typeId="ATOM"/>
<namespace ns="http://www.ascc.net/xml/schematron" typeId="SCHEMATRON"/>

<typeId id="ATOM" uri="atom.rnc"/>
<typeId id="SCHEMATRON" uri="iso-schematron.rnc"/>
</locatingRules>
----

これで、*.atomを開くと、、、お、自動的にSchemaが選択された。


道程は長い。こつこつ。