読者です 読者をやめる 読者になる 読者になる

XMLの基本知識

ゴールデンウィーク明けあたりから,
ファイル内の文字列置換ツールを作成していた.

「そんなもん,世の中にいくらでも転がってますがな」
と言われれば,その通りなんだけど,
mavenJUnitの勉強が主目的だったので,
そこは気にしない方針で.

置換のルールはXMLで記述することにしたんだけど,
ここでかなり躓いた.
というか,XMLに対する知識が不足しすぎていた.

特によくわからなかったのが,DocumentとElementとNodeの違い.
色々と調べたけど,
一番わかりやすかったのは,以下かな.
JavaScriptのサイトだけど,まあ共通的な話なので問題ないはず)
DOMの基本構造 - Programming Field

XMLは,Nodeとそのネストで構成される」
「ネストの表現方法は,NamedNodeMapとNodeListの2種類がある」
「ElementもDocumentもAttrも,Nodeの継承クラスである」
という点さえ抑えておけば,以後は混乱することはなさそう.

あと,上記ページ内にしれっと書いてある
「改行やインデントによるTextノード」
も,見通しがちな要素だと思う.

たとえば以下.

<?xml version="1.0" encoding="UTF-8"?>
<Rulebook>
    <Rule type="update">
        <before>test</before>
        <after>testtest</after>
    </Rule>
</Rulebook>

Rulebook配下に紐づくNodeListの要素数はいくつでしょう?

答え:1個……ではなく,
(1)「\n(半角スペース×4)」というTextノード.
(2) Ruleという名称のElementノード.
(3)「\n」というTextノード.
の,合計3個になる.たぶん(\nは改行コード).

同様に,Rule配下には,
1つの要素をもつNamedNodeMap(type)と,
5つの要素をもつNodeList(改行,before,改行,after,改行)
が紐づいている,という扱いになる,はず.

ただ,こんな「改行が~」とか「スペースが~」とか
どうでも良い要素にいちいち振り回されるのも変な話で,
上手い回避方法はあるんだと思う.

とりあえず今回色々試した限りでぶつかった事象と,
それらの原因調査結果については,上記のような感じ.


当初の目的からはちょっと違うところで時間がかかってしまった…….