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>