🐥

RELAX NGスキーマを操作するライブラリjingtrangを試す:rngファイルの作成編

2023/01/18に公開

概要

以下の記事で、jingtrangおよびrngファイルを用いたxmlファイルの検証を行いました。

https://zenn.dev/nakamura196/articles/6d156ca1b0c09e

このjingtrangライブラリでは、xmlファイルからrngファイルを作成できるということで、試してみます。

Google Colabのノートブックも用意しました。

https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/jingtrangを試す:作成編.ipynb

rngファイルを作成する

rngファイルを作成する元ファイルとして、以下を用意しました。

base.xml
<root><title>aaa</title></root>

上記のファイルに対して、以下を実行します。

pytrang base.xml base.rng

結果、以下のファイルが作成されました。

base.rng
<?xml version="1.0" encoding="UTF-8"?>
<grammar ns="" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <start>
    <element name="root">
      <element name="title">
        <data type="NCName"/>
      </element>
    </element>
  </start>
</grammar>

このrngファイルに対して、以下のようにテストしてみました。

OK:テキストが異なるもの

ex1.xml
<root><title>bbb</title></root>
pyjing base.rng ex1.xml

NG:titleがない

ex2.xml
<root><aaa>bbb</aaa></root>
pyjing base.rng ex2.xml
/content/ex2.xml:1:12: error: element "aaa" not allowed anywhere; expected element "title"
/content/ex2.xml:1:28: error: element "root" incomplete; missing required element "title"

NG: 属性がある

ex3.xml
<root><title lang="en">aaa</title></root>
pyjing base.rng ex3.xml
/content/ex3.xml:1:24: error: found attribute "lang", but no attributes allowed here

まとめ

上記のような形で、あるxmlファイルから、rngファイルを作成することができました。rngファイルの記述方法についてはさらなる勉強が必要ですが、今回のような具体例から試行錯誤ができる仕組みは有効かと思います。

rngファイルを勉強する上で、参考になりましたら幸いです。

Discussion