XMLを編集するテキストエディタならjEditはどうですか

XMLとjEdit
---

### 初めに
XMLをテキストエディタで手書きで書きたいと思ったことはありませんか。

この質問に対して「はい」と答える人はそうはいないでしょう。例えばWindowsのメモ帳で何百何千行のXMLを編集することを強いられて、いやだと思わない人はいないはずです。一般的に言ってXMLは書きやすいコードではありません。もし仮にテキストエディタでXMLを書くのだとしたら、その負担を軽減する機能が十分に備わっているものでなければやる気は起こらないでしょう。
そこでこのような事例に適したものとして、この記事で[jEdit](http://www.jedit.org/)というテキストエディタについて、特にXML機能に焦点を絞ってご紹介します。

### jEdit
jEditはJavaで書かれたテキストエディタです。jEditはXMLを手書きすることが多い私のお気に入りのテキストエディタで、数年前から使い始めたばかりですが、XML関連の機能に多く助けられ、また、使いこなすための知見が貯まってきました。今回はそれについて書きます。
ただし、これを使うにはまずJava実行環境が必要です。（ただしJava10以前の話になります。11以降ではまた話が違ってきますがそのことについては詳説しません。）今回はXML向け機能に絞って話を進めるのでダウンロードやインストールの仕方などは省きます。

### この記事で想定する環境
機能を紹介するにあたって想定する環境は以下になります。

<dl>
<dt>OS<dt>
<dd>Windows 10 Pro</dd>
<dt>ユーザーディレクトリ</dt>
<dd>C:\Users\hoge</dd>
<dt>jEditバージョン</dt>
<dd>5.5.0</dd>
</dl>

### プラグイン
jEditにはプラグイン機能があり様々な機能を必要なだけ持たせることができます。このうち今回はXMLプラグインとXSLTプラグインを使います。
プラグインの具体的なインストール方法などは今回では省きます。

### スキーマ
さて、必要な準備はそろいました。XMLを書くための基本的な機能としてシンタックスハイライトや終了タグの補完、整形式XMLかどうかのチェックなどがありますが、jEditの大きな特徴としてスキーマへの対応があります。XMLにはスキーマを持たせることができます。よく使われるものとしてはDTDとXML Schemaがあり、他には[RelaxNG](http://www.relaxng.org/)およびRelaxNG Compact Syntacsがあります。このスキーマの存在によってツールがあればXMLの検証を行い適正かどうかのチェックを行えます。jEditのXMLプラグインにもそのツールがあり、それだけでなく補完機能もあります。
4つのスキーマ形式に対応し補完機能まで備え付けているのはGUIテキストエディタの中ではjEditのほかにないのではないでしょうか。
この機能を最大限受ける方法があります。私がどのようにしているかを例にして恩恵を体験してもらいたいです。
ユーティリティ→個人設定ディレクトリ→plugins
と進んでみてください。xml.XmlPluginにschemas.xmlという名のlocatingRulesがあります。私は下記のようにしています。

```xml:schemas.xml
<?xml version="1.0" ?>
<locatingRules xmlns="http://thaiopensource.com/ns/locating-rules/1.0">
<include rules="jeditresource:/XML.jar!/xml/dtds/schemas.xml" />
<include rules="file:/C:/Users/hoge/workspace/nandaka-furari.github.io/files/xml/locatingRules/files.xml"></include>
<include rules="file:/C:/Users/hoge/workspace/nandaka-furari.github.io/files/xml/locatingRules/web-resource.xml"></include>
</locatingRules>
```
そしてこれに書かれているfiles.xmlとweb-resource.xmlは下記のようになっています。

```xml:files.xml
<?xml version="1.0" ?>
<locatingRules xmlns="http://thaiopensource.com/ns/locating-rules/1.0">
	<typeId id="XHTML2" uri="../rng/xhtml2d1.rng"/>
	<namespace ns="http://www.w3.org/2002/06/xhtml2/" typeId="XHTML2"/>
	<typeId id="XBEL" uri="../rng/xbel.rng"/>
	<namespace ns="http://www.python.org/topics/xml/xbel/" typeId="XBEL"/>
	<typeId id="SAMPLE" uri="../rng/sample.rng"/>
	<namespace ns="urn:sample" typeId="SAMPLE"/>
	<typeId id="POM" uri="../../rnc/pom5.rnc"/>
	<namespace ns="urn:pom" typeId="POM"/>
</locatingRules>
```
```xml:web-resource.xml
<?xml version="1.0" ?>
<locatingRules xmlns="http://thaiopensource.com/ns/locating-rules/1.0">
	<!-- here you can match the root element's local name
		<documentElement localName="addressBook" typeId="AB"/>
	 -->
	<uri pattern="*.svg" typeId="SVG"/>
	<typeId id="SVG" uri="https://www.w3.org/Graphics/SVG/1.2/rng/Tiny-1.2/Tiny-1.2.rng"/>

	<uri pattern="*.xsl" typeId="XSLT2"/>
	<typeId id="XSLT2" uri="http://www.w3.org/2007/schema-for-xslt20.xsd"></typeId>
</locatingRules>
```
このような設定を行うことによって任意の拡張子や名前空間のXMLに対してスキーマを紐づけることができます。自分で定義したスキーマのXMLを書くこととスキーマを定義することそのものも、どちらも簡単に行えるようになります。

### XSLT
またXSLTプラグインではXSLT処理を簡単に行うことができます。このプラグインの最大の特徴といっていいのはSaxonプラグインを同時に入れることによってXSLT2.0に対応できることです。上記のスキーマ対応と合わせてXSLT2.0を学習するのにこれ以上ない環境を整えることができます。XSLTというと1.0しか知らない方も多いのではないでしょうか。しかし、詳しいことは省きますがXSLT2.0はXSLT1.0とはまるで別物です。jEditはXSLTの持つ潜在能力を体験できます。

### 終わりに

いかがだったでしょうか。書くことが敬遠されがちなXMLもjEditを相棒とすれば苦痛が和らぎ、XMLの持つ能力が存分に引き出されます。もちろんXMLを書く以外にも通常のテキストエディタとして実用的な能力を持っています。今まで使ったことがない方もぜひとも一度はjEditを使ってみてはどうでしょうか。