Index > Ant で XMLを処理 ... DOCTYPE 宣言の削除
Fri, August 7, 2009

Ant で XMLを処理 ... DOCTYPE 宣言の削除

jdom などでXMLを変換するときに、DOCTYPE宣言がついていると(ネットワークに情報を取得していくのか) 処理がとても遅くなることがある。 そこで、DOCTYPE宣言を削除してからXMLを変換するのだが、その削除作業をAntで行う方法。

このエントリでは、処理するXML文書はDocBook v4.4で記述されていることとする。

replaceregexp task を使って削除

mydocbook.xml

Docbook v4.4 のDOCTYPE宣言は、XML宣言の直ぐしたに記述されている。 以下の例では、2行目と3行目を削除すればいいだけの話。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
                      "http://www.docbook.org/xml/4.4/docbookx.dtd">

remove_doctype_docbook.xml

Antでこれを処理するには、 replaceregexp タスクを使って削除する。

<?xml version="1.0" encoding="UTF-8" ?>

<project>
    <target name="remove_doctype_docbook" >

        <replaceregexp
            match=".!DOCTYPE book PUBLIC .-//OASIS//DTD DocBook XML V4.4//EN."
            replace=""
            file="${myxml}" 
            encoding="UTF-8"
            byline="true" flags="g"
        />
        <replaceregexp
            match=".http://www.docbook.org/xml/4.4/docbookx.dtd.."
            replace=""
            file="${myxml}" 
            encoding="UTF-8"
            byline="true" flags="g"
        />
    </target>

</project>

このタスクは繰り返しいろいろな変換作業で使用するので、 build.xmlに直接記述しないで、remove_doctype_docbook.xml というファイルに保存し、 モジュール化し、import タスクを使って、build.xml から使用する。

build.xml

remove_doctype_docbook.xml を使用する例

<?xml version="1.0" encoding="UTF-8" ?>
<project basedir="." default="main" >
        <import file="remove_doctype_docbook.xml" optional="true" />

        <target name="main" >
                <antcall target="remove_doctype_docbook">
                        <param name="myxml" value="mydocbook.xml" />
                </antcall>
        </target>
</project>
 Twitter
follow me on Twitter
 Categories