name
属性を持った全てのタグの変更の2つの方法について説明します。
<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>
上のJavaコードの中で、強調されたコードはDOM要素のNodeListを抽出する方法を示しています。
最初の強調されたコードは、与えられた型の全てのタグをどの様に見つけるかを示しており、このケースでは<h2>タグになります。
2つ目の強調された部分は、<name>属性に与えられたの値を持った全てのタグをどの様に抽出するかを示しており、このケースでは<name="highlight">になります。
centerSubheaders()とalterHighlighting()の2つのメソッドは、
NodeListを走査し各要素単位で順番に処理する方法と、与えられた要素の属性を操作する方法を示しています。
DOMのはるかに洗練された処理によって行う事も可能でするが、それはこのドキュメントの範囲を越えます。
javadocで生成されたJava DOM APIを熟読する事を提唱します。
もう一度繰り返しますが、上の例のHTMLでは空白に手が加えられています。
XMLCはできるだけ多くの空白を取り除く処理をします。
構成された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() );
}
}
生成される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>