XMLCチュートリアル: Document要素のグループ化

内容

  1. 複合的な変更でのXMLCの利用法
  2. サンプルHTMLページ
  3. 構成されたDocument Object Model (DOM)
  4. 生成されるJavaクラス
  5. マニピュレーション(Manipulation)Javaクラスからの利用法
  6. 生成されるHTML

複合的な変更でのXMLCの利用法

本章は、文書中のいくつかの場所に対して特定の変更を行う為にXMLCを利用する方法について説明します。 この変更を行うにはいくつかの方法があります。 ここでは、特定の型の全てのタグの変更と、共通のname属性を持った全てのタグの変更の2つの方法について説明します。

サンプルHTMLページ

以下のサンプルHTMLは、数個の<h2>タグと、数個の<name>属性を持ったタグを含んでいます。


<HTML>
<HEAD>
    <TITLE>Hello, World</TITLE>
</HEAD>

<BODY BGCOLOR=#FFFFFF TEXT="#000000">

<H1>Hello, World</H1>

<H2>A subheader</H2>

We want to <FONT COLOR='00FF00' NAME='highlight'>highlight</FONT> part of
this sentence. 

<H2>Another subheader</H2>

In this sentence, we display the colors <FONT COLOR='FF0000'>red</FONT>,
<FONT COLOR='00FF00'>green</FONT> and <FONT COLOR='0000FF'>blue</FONT>. 

<P>
The previous sentence <FONT COLOR='00FF00' NAME='highlight'>did not use
color to highlight text</FONT>!

</BODY>
</HTML>

構成されたDocument Object Model (DOM)

XMLCは、上のHTMLの為に以下のDocument Object Model(DOM)を生成します。


DOM hierarchy:
    BasicHTMLDocument
        BasicHTMLHtmlElement: html
            BasicHTMLHeadElement: head
                BasicHTMLTitleElement: title
                    BasicText: text=Hello, World
            BasicHTMLBodyElement: body: bgcolor='#FFFFFF' text='#000000'
                BasicHTMLHeadingElement: h1
                    BasicText: text=Hello, World
                BasicHTMLHeadingElement: h2
                    BasicText: text=A subheader
                BasicText: text=We want to 
                BasicHTMLFontElement: font: color='00FF00' name='highlight'
                    BasicText: text=highlight
                BasicText: text= part of this sentence.
                BasicHTMLHeadingElement: h2
                    BasicText: text=Another subheader
                BasicText: text=In this sentence, we display the colors 
                BasicHTMLFontElement: font: color='FF0000'
                    BasicText: text=red
                BasicText: text=, 
                BasicHTMLFontElement: font: color='00FF00'
                    BasicText: text=green
                BasicText: text= and 
                BasicHTMLFontElement: font: color='0000FF'
                    BasicText: text=blue
                BasicText: text=.
                BasicHTMLParagraphElement: p
                    BasicText: text=The previous sentence 
                    BasicHTMLFontElement: font: color='00FF00' name='highlight'
                        BasicText: text=did not use color to highlight text
                    BasicText: text=!

生成されるJavaクラス

XMLCは上のHTMLの為に以下のJavaのクラスを生成します。 id属性の場合とは違って、XMLCはname属性の為には何も特別なJavaコードは生成しません。 しかしながら、W3CのDocument Object Model APIに定義されるメソッドを使用する事が出来ます。


/*
 ************************************
 * XMLC GENERATED CODE, DO NOT EDIT *
 ************************************
 */
import org.w3c.dom.*;
import com.lutris.xml.xmlc.XMLCUtil;
public class demo_grouping extends com.lutris.xml.xmlc.html.HTMLObject {
    private static Document protoDocument;
    static private void initProtoDom() {
        Node $node0, $node1, $node2, $node3, $node4;
        Element $elem0, $elem1, $elem2, $elem3;
        Attr $attr0, $attr1, $attr2, $attr3;

        com.docuverse.dom.DOM $$dom = new com.docuverse.dom.DOM();
        com.docuverse.dom.html.HTMLFactory $$factory = new com.docuverse.dom.html.HTMLFactory();
        $$dom.setFactory($$factory);
        protoDocument = (Document)$$factory.createDocument($$dom, "HTML");
        
        $elem0 = protoDocument.createElement("html");
        protoDocument.appendChild($elem0);
        
        $elem1 = protoDocument.createElement("head");
        $elem0.appendChild($elem1);
        
        $elem2 = protoDocument.createElement("title");
        $elem1.appendChild($elem2);
        
        $node3 = protoDocument.createTextNode("Hello, World");
        $elem2.appendChild($node3);
        
        $elem1 = protoDocument.createElement("body");
        $elem0.appendChild($elem1);
        
        $attr1 = protoDocument.createAttribute("text");
        $attr1.setValue("#000000");
        $elem1.setAttributeNode($attr1);
        
        $attr1 = protoDocument.createAttribute("bgcolor");
        $attr1.setValue("#FFFFFF");
        $elem1.setAttributeNode($attr1);
        
        $elem2 = protoDocument.createElement("h1");
        $elem1.appendChild($elem2);
        
        $node3 = protoDocument.createTextNode("Hello, World");
        $elem2.appendChild($node3);
        
        $elem2 = protoDocument.createElement("h2");
        $elem1.appendChild($elem2);
        
        $node3 = protoDocument.createTextNode("A subheader");
        $elem2.appendChild($node3);
        
        $node2 = protoDocument.createTextNode("We want to ");
        $elem1.appendChild($node2);
        
        $elem2 = protoDocument.createElement("font");
        $elem1.appendChild($elem2);
        
        $attr2 = protoDocument.createAttribute("name");
        $attr2.setValue("highlight");
        $elem2.setAttributeNode($attr2);
        
        $attr2 = protoDocument.createAttribute("color");
        $attr2.setValue("00FF00");
        $elem2.setAttributeNode($attr2);
        
        $node3 = protoDocument.createTextNode("highlight");
        $elem2.appendChild($node3);
        
        $node2 = protoDocument.createTextNode(" part of this sentence.");
        $elem1.appendChild($node2);
        
        $elem2 = protoDocument.createElement("h2");
        $elem1.appendChild($elem2);
        
        $node3 = protoDocument.createTextNode("Another subheader");
        $elem2.appendChild($node3);
        
        $node2 = protoDocument.createTextNode("In this sentence, we display the colors ");
        $elem1.appendChild($node2);
        
        $elem2 = protoDocument.createElement("font");
        $elem1.appendChild($elem2);
        
        $attr2 = protoDocument.createAttribute("color");
        $attr2.setValue("FF0000");
        $elem2.setAttributeNode($attr2);
        
        $node3 = protoDocument.createTextNode("red");
        $elem2.appendChild($node3);
        
        $node2 = protoDocument.createTextNode(", ");
        $elem1.appendChild($node2);
        
        $elem2 = protoDocument.createElement("font");
        $elem1.appendChild($elem2);
        
        $attr2 = protoDocument.createAttribute("color");
        $attr2.setValue("00FF00");
        $elem2.setAttributeNode($attr2);
        
        $node3 = protoDocument.createTextNode("green");
        $elem2.appendChild($node3);
        
        $node2 = protoDocument.createTextNode(" and ");
        $elem1.appendChild($node2);
        
        $elem2 = protoDocument.createElement("font");
        $elem1.appendChild($elem2);
        
        $attr2 = protoDocument.createAttribute("color");
        $attr2.setValue("0000FF");
        $elem2.setAttributeNode($attr2);
        
        $node3 = protoDocument.createTextNode("blue");
        $elem2.appendChild($node3);
        
        $node2 = protoDocument.createTextNode(".");
        $elem1.appendChild($node2);
        
        $elem2 = protoDocument.createElement("p");
        $elem1.appendChild($elem2);
        
        $node3 = protoDocument.createTextNode("The previous sentence ");
        $elem2.appendChild($node3);
        
        $elem3 = protoDocument.createElement("font");
        $elem2.appendChild($elem3);
        
        $attr3 = protoDocument.createAttribute("name");
        $attr3.setValue("highlight");
        $elem3.setAttributeNode($attr3);
        
        $attr3 = protoDocument.createAttribute("color");
        $attr3.setValue("00FF00");
        $elem3.setAttributeNode($attr3);
        
        $node4 = protoDocument.createTextNode("did not use color to highlight text");
        $elem3.appendChild($node4);
        
        $node3 = protoDocument.createTextNode("!");
        $elem2.appendChild($node3);
        
    }

    static {
        initProtoDom();
    }

    public demo_grouping() {
        super(protoDocument);
    }


}

マニピュレーション(Manipulation)Javaクラスからの利用法


import org.w3c.dom.*;
import org.w3c.dom.html.*;

public class demo_grouping_creator {

    private static void centerSubheaders( NodeList nodeList ){

        int length = nodeList.getLength(); 
        int i ; 

        for( i=0 ; i<length ; i++ ){ 
            HTMLElement element = (HTMLElement) nodeList.item( i ); 
            element.setAttribute( "ALIGN", "CENTER" ); 
        }

    }

    private static void alterHighlighting( NodeList nodeList ){

        int length = nodeList.getLength(); 
        int i ; 

        for( i=0 ; i<length ; i++ ){ 
            HTMLElement element = (HTMLElement) nodeList.item( i ); 
            element.removeAttribute( "COLOR" ); 
            element.setAttribute( "SIZE", "+2" ); 
        }

    }
   
    public static void main (String[] args) {
    
        // Create an instance of the HTML page object.
        demo_grouping grouping = new demo_grouping();
    
        // Get a list of all H2 elements
        NodeList subheaderElements = grouping.getElementsByTagName( "H2" ); 
    
        // Add an 'ALIGN=CENTER' attribute to these elements
        centerSubheaders( subheaderElements ); 
    
        // Get a list of all nodes with name 'highlight'
        NodeList highlightElements = grouping.getElementsByName( "highlight" ); 
    
        // In these elements, replace the COLOR attribute with a FONT attribute
        alterHighlighting( highlightElements ); 
    
        // Print out the results.
        System.out.print( grouping.toString() );
    
    }

}

上のJavaコードの中で、強調されたコードはDOM要素のNodeListを抽出する方法を示しています。 最初の強調されたコードは、与えられた型の全てのタグをどの様に見つけるかを示しており、このケースでは<h2>タグになります。 2つ目の強調された部分は、<name>属性に与えられたの値を持った全てのタグをどの様に抽出するかを示しており、このケースでは<name="highlight">になります。

centerSubheaders()alterHighlighting()の2つのメソッドは、 NodeListを走査し各要素単位で順番に処理する方法と、与えられた要素の属性を操作する方法を示しています。

DOMのはるかに洗練された処理によって行う事も可能でするが、それはこのドキュメントの範囲を越えます。 javadocで生成されたJava DOM APIを熟読する事を提唱します。

生成されるHTML

上の例によって作成されるHTMLページを以下に示します。


<html>
<head>
    <title>Hello, World</title>
</head>

<body text='#000000' bgcolor='#FFFFFF'>

<h1>Hello, World</h1>

<h2 ALIGN='CENTER'>A subheader</h2>

We want to <font name='highlight'
SIZE='+2'>highlight</font> part of this sentence.

<h2 ALIGN='CENTER'>Another subheader</h2>

In this sentence, we display the colors <font color='FF0000'>red</font>,
<font color='00FF00'>green</font> and <font color='0000FF'>blue</font>.
<p>
The previous sentence <font name='highlight' SIZE='+2'>did not use color to
highlight text</font>!
</p>

</body>
</html>

もう一度繰り返しますが、上の例のHTMLでは空白に手が加えられています。 XMLCはできるだけ多くの空白を取り除く処理をします。