XML::DOMモジュール(日本語チョー訳)

by Hippo2000(1999/5/12)

XML::DOMモジュールなのです。DOMって何さってこともちょっとはわかるかも。

なおこのドキュメントではXML::DOMモジュール(dom.pm)にpod2htmlを実行して作成されたファイルをベースにして、編集をくわえて日本語に訳そうとしたものです。わかりにくい部分は本物を見てください。(^^;
といってもこの原本自体かなりあやしげな部分があったりします。

DOM仕様書などを見るともっとわかりやすいのではないかと感じています。
->これを作成するにあたっては、どら猫本舗さんのページを参考にさせていただきました。

原本の著作権はEnno Derksen 氏Clark Cooper 氏がお持ちです(詳しくは作者の部分を見てください)。
Enno Derksenさんにはメールで了解をいただきました。

なお内容等が間違っていたら修正します。ご連絡ください。


目次


名前

XML::DOM - DOM レベル 1 互換の文書構造を構築するPerlモジュール


概要

 use XML::DOM;
 my $parser = new XML::DOM::Parser;
 my $doc = $parser->parsefile ("file.xml");
 # print all HREF attributes of all CODEBASE elements
 my $nodes = $doc->getElementsByTagName ("CODEBASE");
 my $n = $nodes->getLength;
 for (my $i = 0; $i < $n; $i++)
 {
     my $node = $nodes->item ($i);
     my $href = $node->getAttribute ("HREF");
     print $href->getValue . "\n";
 }
 $doc->printToFile ("out.xml");
 print $doc->toString;

説明

このモジュールはClark CooperXML::Parserモジュールを拡張しています。James Clarkのexpatライブラリへの下位レベルのインターフェースであるXML::Parser::Expatの上にXML::Parserモジュールは作られています。

XML::DOM::ParserXML::Parserから派生しています。それはXML文字列あるいはファイルを解析し、http://www.w3.org/TR/REC-DOM-Level-1 で記述されている文書オブジェクトモデル(Document Object Model)APIに適応する(comform)データ構造を構築します。XML::DOM::Parserクラスがもっている他に使用できる機能についてはXML::Parserのマニュアルをご覧ください。 Style'プロパティは使わってはいけないことに注意してください。(内部で設定されます)

XML::Parser NoExpand オプションはそのままサポートされます。その場合、キャラクタ・データのなかでエンティティ・リファレンスが見つかったときにはいつでもEntityReferenceオブジェクトが生成されます。これが便利かどうかよくわかりません。ご意見をお待ちしています。

概要にもあるように、XML::DOM::Parserを作成すると、parseとparsefileメソッドは指定された入力からXML::DOM::Document オブジェクトを作成します。そしてこのDocumentオブジェクトを検査したり、変更したりファイルに書き出したり、文字列に変換したりすることができます。

XML::DOMversion 2.19以降のXML::Parserと一緒に使い、XML::DOM::ParserオプションのKeepCDATA 1に設定すると、Textノードに変換するのではなく、CDATASectionCDATASectionノードに格納します。 後に続く、CDATASectionノードは1つにまとめられます。これが問題であればお知らせください。

DocumentはNode(ノード)オブジェクトからなる1つのツリー構造を持ちます。ノードはその種類によって他のノードを持つことがあります。DocumentはElement、Text、Comment、CDATASectionノードを持つことが出来ます。 ElementノードはAttr、Element、Text、Comment、CDATASectionノードを持つことが出来ます。他のノードは何も子供のノードを持たないかも知れません。

このモジュールは数種の(まだ)DOMの仕様にはなっていないノードタイプを追加します。それらは:ElementDecl (<!ELEMENT ...>宣言に対応), AttlistDecl (<!ATTLIST ...>宣言に対応), XMLDecl (<?xml ...?>宣言に対応)、AttDef (AttlistDeclでの属性の定義に対応)です。


DOM API

XML::DOM

定数定義
ノードの種類を示す以下の定数があらかじめ決められています。
 UNKNOWN_NODE (0)                このノードの種類は分かりません。(DOMにはありません)
 ELEMENT_NODE (1)                このノードは Element.
 ATTRIBUTE_NODE (2)              このノードは Attr.
 TEXT_NODE (3)                   このノードは Text ノード
 CDATA_SECTION_NODE (4)          このノードは CDATASection.
 ENTITY_REFERENCE_NODE (5)       このノードは EntityReference.
 ENTITY_NODE (6)                 このノードは Entity.
 PROCESSING_INSTRUCTION_NODE (7) このノードは ProcessingInstruction.
 COMMENT_NODE (8)                このノードは Comment.
 DOCUMENT_NODE (9)               このノードは Document.
 DOCUMENT_TYPE_NODE (10)         このノードは DocumentType.
 DOCUMENT_FRAGMENT_NODE (11)     このノードは DocumentFragment.
 NOTATION_NODE (12)              このノードは Notation.
 ELEMENT_DECL_NODE (13)          このノードは ElementDecl (DOMにはありません)
 ATT_DEF_NODE (14)               このノードは AttDef (DOMにはありません)
 XML_DECL_NODE (15)              このノードは XMLDecl (DOMにはありません)
 ATTLIST_DECL_NODE (16)          このノードは AttlistDecl (DOMにはありません)
 使い方:
   if ($node->getNodeType == ELEMENT_NODE)
   {
       print "It's an Element"; #これはElement
   }

DOM仕様外: DOMの仕様はUNKNOWN_NODEについて言及していません。そして正直に言えばこれに出会うことはありません。最後の4つのノード種類は4つの追加されたノードクラスをサポートするために追加されています。

グローバル変数

$VERSION
$XML::DOM::VERSIONには、この実装のバージョン番号が入ります。例えば "1.07"

DOM仕様にはない追加のメソッド

getIgnoreReadOnly と ignoreReadOnly (readOnly)
DOM レベル 1仕様では、例えばDocumentTypeのような、文書でのあるセクションを編集することを許していません。そのためデフォルトではこの実装は、読み込み専用のノードを編集しようとするとDOMExeptionを起こします。(例えばNO_MODIFICATION_ALLOWED_ERR)。グローバルのIgnoreReadOnlyフラグを設定することにより、これらの読み込み専用のチェックは(一時的に)やめることができます。

ignoreReadOnlyメソッドはグローバルのIgnoreReadOnlyを設定し、その直前の値を返します。getIgnoreReadOnlyメソッドは単に現在の値を返します。

 my $oldIgnore = XML::DOM::ignoreReadOnly (1);
 eval {
 ... 他の例外を受けながら、やりたいことをします
 };
 XML::DOM::ignoreReadOnly ($oldIgnore);     # 前の値に戻します
isValidName (name)
指定されたnameがXMLの仕様として適正な「名前」であるかを判定します。この実装では、今のところASCII文字からなる名前だけを受け付けます。Perlが正規表現でUTF-8をサポートするときには、アップグレードしなければいけません。

XML::DOM::Node

グローバル変数

@NodeNames
@XML::DOM::Node::NodeNamesはノード種類の定数を文字列に対応づけられて入っています。 XML::DOM::Node::getNodeTypeName.によって使われます。

メソッド

getNodeType
ノード種類をしめす整数値を返します。XML::DOM定数をご覧ください。
getNodeName
ノードの種類によってプロパティまたは直にコーディングされた文字列を返します。対応する関数や値を以下に示します。:
 Attr                   getName
 AttDef                 getName
 AttlistDecl            getName
 CDATASection           "#cdata-section"
 Comment                "#comment"
 Document               "#document"
 DocumentType           getNodeName
 DocumentFragment       "#document-fragment"
 Element                getTagName
 ElementDecl            getName
 EntityReference        getEntityName
 Entity                 getNotationName
 Notation               getName
 ProcessingInstruction  getTarget
 Text                   "#text"
 XMLDecl                "#xml-declaration"

DOM仕様外: AttDef, AttlistDecl, ElementDecl ,XMLDeclは抜けがないように追加しました。

 
getNodeValue と setNodeValue (value)
ノードの種類によって文字列またはundefを返します。このメソッドは完全性のために提供されています。言い換えれば、プログラマが投げあげるのを減らします。値はサブクラスで定義されているメソッドを通すことにより使用可能であるか、undefを返すかのどちらかです。対応するメソッドは以下の通りです:Attr::getValue, Text::getData, CDATASection::getData, Comment::getData, ProcessingInstruction::getData。
getParentNode と setParentNode (parentNode)
このノードの親です。Document, DocumentFragment, Attrを除くすべてのノードは親をもっているでしょう。しかし、作成されたばかりだったり、ツリーに追加される前だったり、あるいは、ツリーから削除された場合には、undefになります。
getChildNodes
このノードの子供が入っているNodeListです。子供がなければ、何もノードがないNodeListです。返されるNodeListの中身はある意味では「生きています(=lived)」。例えば、そのノードオブジェクトの子供を変更すると、NodeListにアクセスして返されたノードにもただちに反映されます。これはノードの内容の静的なスナップショットではありません。getElementsByTagNameメソッドによって返されるものも含めて、このことはすべてのNodeListに当てはまります。

注意: この実装ではgetElementsByTagNameでは「生きた」NodeListを返しません。 注意事項をご覧下さい。.

このメソッドがリストコンテキストで呼ばれると、子供のノードが入った通常のPerlのリストを返します。このリストは「生きて」ないことに注意して下さい。 例えば:.

 @list = $node->getChildNodes;        # Perlのリストを返します
 $nodelist = $node->getChildNodes;    # NodeList (オブジェクト・リファレンス)を返します
 for my $kid ($node->getChildNodes)   # $nodeの子供を繰り返します
getFirstChild
このノードの最初の子供。そのようなノードがなければundefを返します。
getLastChild
このノードの最後の子供。そのようなノードがなければundefを返します。
getPreviousSibling
このノードの直前のノード。そのようなノードがなければundefを返します。
getNextSibling
このノードの直後のノード。そのようなノードがなければundefを返します。
getAttributes
(これがElementであれば) このノードの属性(Attrノード)が入ったNamedNodeMap、そうでなければundef。返されたオブジェクトにノードを追加したり、削除すると、NamedNodeMapのもとになったElementノードにもノードが追加、削除されることに注意してください。
getOwnerDocument
このノードに関連づけられているDocumentオブジェクト。新しいノードを作るために使われたDocumentオブジェクトでもあります。このノードがDocumentであれば、undefです。
insertBefore (newChild, refChild)
ノードnewChildをすでにある子供ノードrefChildの前に挿入します。refChildがundefならば、子供のリストの末尾にnewChildが挿入されます。

newChildがDocumentFragmentオブジェクトであれば、その子供が同じ順序で、refChildの前にすべて挿入されます。newChildがツリーの中にすでに入っていれば、最初に削除されます。

戻り値: 挿入されたノード

DOMExceptions:

  • HIERARCHY_REQUEST_ERR

    このノードのタイプがnewChildノードのタイプの子供を許さないか、挿入するノードがこのノードの祖先であるとき発生します。

  • WRONG_DOCUMENT_ERR

    newChildがこのノードを作成したものとは違う文書から作成されたとき発生します。

  • NO_MODIFICATION_ALLOWED_ERR

    このノードが読み込み専用のとき、発生します。

  • NOT_FOUND_ERR

    refChildがこのノードの子供でないと発生します。

replaceChild (newChild, oldChild)
子供のリストの中で子供のノードoldChildをnewChildに置き換えます。そしてoldChildノードを返します。 もしnewChildがすでにツリーの中にあれば、最初に削除されます。

戻り値: 置き換えられたノード

DOMExceptions:

  • HIERARCHY_REQUEST_ERR

    このノードがnewChildのタイプの子供を持つことを許さないタイプであるか、入れるノードがこのノードの祖先であるとき発生します。

  • WRONG_DOCUMENT_ERR

    newChildがこのノードを作成したものとは違う文書から作成されたとき発生します。

  • NO_MODIFICATION_ALLOWED_ERR

    このノードが読み込み専用のとき、発生します。

  • NOT_FOUND_ERR

    oldChildがこのノードの子供でないと発生します。

removeChild (oldChild)
oldChildで示される子供ノードを子供のリストから削除し、それを返します。

戻り値: 削除されたノード

DOMExceptions:

  • HIERARCHY_REQUEST_ERR

    このノードがnewChildのタイプの子供を持つことを許さないタイプであるか、入れるノードがこのノードの祖先であるとき発生します。(訳者注:間違いのようだ)

  • WRONG_DOCUMENT_ERR

    newChildがこのノードを作成したものとは違う文書から作成されたとき発生します。(訳者注:間違いのようだ)

  • NO_MODIFICATION_ALLOWED_ERR

    このノードが読み込み専用のとき、発生します。

  • NOT_FOUND_ERR

    oldChildがこのノードの子供でないと発生します。

appendChild (newChild)
ノードnewChildをこのノードの子供のリストの最後に追加します。newChildがすでにツリーの中にあれば、最初に削除されます。それがDocumentFragmentオブジェクトであれば、その文書フラグメントの内容の全てがこのノードの子供のリストに移動します。

戻り値: 追加されたノード

DOMExceptions:

  • HIERARCHY_REQUEST_ERR

    このノードがnewChildのタイプの子供を持つことを許さないタイプであるか、入れるノードがこのノードの祖先であるとき発生します。

  • WRONG_DOCUMENT_ERR

    newChildがこのノードを作成したものとは違う文書から作成されたとき発生します。

  • NO_MODIFICATION_ALLOWED_ERR

    このノードが読み込み専用のとき、発生します。

hasChildNodes
ノードが子供を持っているかどうかを簡単に判断することを可能にする簡易なメソッドです。

戻り値: 子供があれば1、そうでなければ0。

cloneNode (deep)
このノードを複写したものを返します。つまり一般的なコピーコンストラクタとして提供しています。複写されたノードには親がありません。(parentNodeはundefを返します)

Elementを複写すると、すべての属性とその値がコピーされます。これにはデフォルトの属性を表わすためにXMLプロセッサが作成したものも含まれます。しかしこのメソッドはdeepを指定しなければ、それが持っているテキストはなにもコピーしません。というのもテキストは子供のTextノードに入っているからです。他のノードのタイプは単純に、ノードのコピーを返します。

引数: deep もしtrueであれば、指定されたノードの下をサブツリーを再帰的に複写します。Falseであえれば、そのノード自身を複写します(もしElementであればその属性も)。

戻り値: 複写されたノード

normalize
このElementの下のサブツリーのすべての深さのすべてのTextノードを、マーク付け (例:タグ、コメント、処理命令、CDATAセクション、エンティティリファレンス) だけがTextノードを分割するという、「通常の」形式にします。文書のDOMビューが保存されても、再ロードされても、同じであることを保証するために使うことが出来ます。特定の文書ツリー構造に依存する(XPointer検索のような)操作が使われるときにも便利です。

DOM仕様外: DOMの仕様では、このメソッドはElementとDocumentクラスインターフェースの中だけで定義されています。しかし、ここで持ってもさしさわりがないかと....

getElementsByTagName
指定されたタグ名を持っている子孫の要素全てのNodeList。順番は事前にElementツリーをトラバーサルしたときに見つかった順になります。

引数: name マッチするタグの名前。特殊な値"*"はすべてのタグにマッチします。

戻り値: マッチするElementノードのリスト

注意: この実装はgetElementsByTagNameでは「生きた」 NodeListを返しません。 注意事項 をご覧ください。

このメソッドがリスト・コンテキストで呼ばれたとき、結果のノードが入った通常のPerlリストを返します。 例えば...

 @list = $node->getElementsByTagName;       # Perlのリストを返します
 $nodelist = $node->getElementsByTagName;   # NodeList(オブジェクトのリファレンス)を返します
 for my $elem ($node->getElementsByTagName) # 結果のノードを繰り返します

DOMの仕様にはない追加されたメソッド

getNodeTypeName
ノードタイプを示す文字列を返します。例えばgetNodeTypeがELEMENT_NODEを返すのであれば、「ELEMENT_NODE」になります。これは@XML::DOM::Node::NodeNamesを使います。
toString
サブツリー全体を文字列で返します。
printToFile (filename)
サブツリー全体を指定されたfilenameのファイルに出力します。

Croaks: 書き込みでファイルがオープンできない場合

printToFileHandle (handle)
サブツリー全体をファイルハンドルに出力します。例えばSTDOUTに出力すときは:
 $node->printToFileHandle (\*STDOUT);
print (obj)
サブツリー全体をそのオブジェクトのprintメソッドを使って出力します。例えばFileHandleオブジェクトに出力するときは:
 $f = new FileHandle ("file.out", "w");
 $node->print ($f);
getChildIndex (child)
getChildNodesによって返されるリストでのchildノードのインデックスを返します。

戻り値: インデックス。見つからなければ-1。

getChildAtIndex (index)
指定されたインデックスの子供ノードまたはundefを返します。
addText (text)
最後の子供がTextノードであれば、指定された文字列をそのノードに追加します。そうでなければ、新しい(指定された文字列を持った)Textノードを追加します。

戻り値: 最後の子供がTextノードであれば、そのノード。そうでなければ、新しいTextノード。

dispose
このノードと子孫でのすべての循環参照を取り除きます。そのためオブジェクトはガベージ・コレクションでクレームを受けるかもしれません。 そのオブジェクトは、以後使ってはいけません。
setOwnerDocument (doc)
このノードとそのすべての子供(そして属性なども)のownerDocumentプロパティを指定された文書に設定します。これにより、異なるXML::DOM::Documentsの間でも、文書のサブツリーをカット・アンド・ペーストすることができるようになります。setOwnerDocumentを呼び出す前に、このノードはまず元の文書から先に削除されていなければなりません。

このノードはDocumentノードに対して呼ばれたときには何もしません。

isAncestor (parent)
parentがこのノードの祖先またはこのノード自身であれば1を返します。
expandEntityRefs (str)
文字列中のすべてのエンティティ・リファレンスを展開し、その結果を返します。エンティティ・リファレンスは文字リファレンス(例: 「&#123;」または「&#x1fc2」)、デフォルトのエンティティ・リファレンス(「&quot;」、「&gt;」、「&lt;」、「&apos;」、「&amp;」)、または所有しているDocumentのDocumentTypeの一部としてEntityオブジェクトの中で定義されたエンティティ・リファレンスがあります。文字リファレンスはUTF-8に展開されます。パラメータ・エンティティ・リファレンス(例 %ent;) は展開されません。

Interface XML::DOM::NodeList

NodeListインターフェースは抽象的な順序付けされたノードの集合体を提供します。この集合体をどのように実装するかについての定義や強制はありません。

NodeListに入っているアイテムは0から始まる整数のインデックスを通じてアクセスすることができます。

DOMの仕様ではすべてのNoldeListは「生きている」つまり、常にDOMツリーへ変更を反映するように記述されてますが、getElemnetsByTagNameによって返されるNodeListはこの実装では「生きて」いません。詳細については注意事項 をご覧ください。

item (index)
その集合体での指定された番号のアイテムを返します。もしindexがそのリストのノードの数以上であれば、undefを返します。
getLength
そのリストのノードの数。正しい子供ノードのインデックスの範囲は0から(長さ-1)までです。

DOMの仕様にはない追加のメソッド

dispose
このNodeListと子孫でのすべての循環参照を取り除きます。そのためオブジェクトはガベージ・コレクションでクレームを受けるかもしれません。そのオブジェクトは、この後使ってはいけません。

Interface XML::DOM::NamedNodeMap

NamedNodeMapインターフェースを実装しているオブジェクトは、名前によりアクセスすることができるノードの集合体を表わすために使われます。NamedNodeMapはNodeListから継承していないことに注意してください。; NamedNodeMapsは特定の順序を何も保持しません。NamedNodeMapを実装しているオブジェクトに入っているオブジェクトは、順番のインデックスによってアクセスできるかもしれません、しかしこれは単にNamedNodeMapの内容の簡単に列挙できるようにするだけで、DOMがこれらのノードの順序を決めていることを意味しているわけではありません。

この実装では、NamedNodeMapに追加されたオブジェクトは順番を保っていることに注意してください。

getNamedItem (name)
nameで指定されたノードを取り出します。

戻り値: 指定された名前の(すべてのタイプの)ノード。指定されたnameがマップのなかになければundef。

setNamedItem (arg)
nodeName属性を使っているノードを追加する。

nodeName属性がノードがそのもとに格納される名前を引き出すために使われるので、(「特殊な」文字列値を持っている)ある種の複数のノードは、名前が壊れてしまうために格納できません。このことはノードに別名を許すよりも望ましいように思います。

引数: arg NamedNodeMapに格納するノード。

このノードは後で、このノードのnodeName属性の値を使ってアクセスできるようになります。その名前のノードがすでにマップにあれば、新しいもので置き換えられます。

戻り値: 新しいノードがすでにある同じ名前のノードを置き換えれば、その前から存在するノードを返します。そうでなければundefを返します。

DOMExceptions:

  • WRONG_DOCUMENT_ERR

    argがこのNameNodeMapを作成したものとは違う文書から作成されたとき発生します。

  • NO_MODIFICATION_ALLOWED_ERR

    このNamedNodeMapが読み込み専用のとき、発生します。

  • INUSE_ATTRIBUTE_ERR

    引数が既にほかのElementオブジェクトの属性になっているAttrのとき発生します。他の要素で再利用するためには、DOMユーザは明示的にAttrノードの複写しなければいけません。

removeNamedItem (name)
名前(=name)により指定されたノードを削除します。もし削除されたノードがデフォルト値をもったAttrであれば、直ちに置き換えられます。

戻り値: マップから削除されたノード。そのような名前のノードがなければundef。

DOMException:

  • NOT_FOUND_ERR

    このマップに指定された名前のノードがないとき発生します。

item (index)
そのマップでの指定されたインデックスのアイテムを返します。indexがマップのなかのノードの数以上であれば、undefを返します。

戻り値: NamedNodeMapでの指定された位置のノード。適切なindexでなければundef。

getLength
マップでのノードの数を返します。正しい子供ノードのインデックスの範囲は0〜(長さ−1)です。

DOMの仕様にはない追加のメソッド

getValues
NamedNodeMapに入っているノードが入ったNodeListを返します。NodeListは「生きて」おり、行われた変更をNamedNodeMapへ反映します。

このメソッドがリスト・コンテキストで呼ばれると、値が入った通常のPerlリストを返します。このリストは「生きていない」ことに注意してください。例:

 @list = $map->getValues;        # Perlのリストを返します。
 $nodelist = $map->getValues;    # NodeList(オブジェクトのリファレンス)を返します
 for my $val ($map->getValues)   # 値で繰り返します
getChildIndex (node)
getValuesで返されるNodeListの中での、そのノードのインデックス。NamedNodeMapにそのノードがなければ-1。
dispose
このNamedNodeMapと子孫でのすべての循環参照を取り除きます。そのためオブジェクトはガベージ・コレクションでクレームを受けるかもしれません。 そのオブジェクトは、以後使ってはいけません。

Interface XML::DOM::CharacterData extends XML::DOM::Node

CharacterData インターフェースはDOMのなかで、文字データにアクセスするための属性とメソッドでNodeを拡張しています。明確にするため、これらの属性とメソッドを使う各オブジェクトではなく、ここで定義されています。直接、CharacterDataに関連するDOMオブジェクトはありませんが、Text、CommentそしてCDATASectionはここからインタフェースを継承しています。このインターフェースでのオフセットはすべて0から始まります。
getData と setData (data)
このインタフェースを実装しているノードの文字データ。DOMの実装では、CharacterDataノードに格納されるデータの量に任意の制限を設定することを許してはいません。しかし、実装の制限はノードのデータの総量は1つのDOMStringに入りきらないかもしれないということを意味するかもしれません。そのような場合、ユーザは適切なサイズに分割して取り出すためにsubstringDataを呼び出すことができます。
getLength
dataと以下のsubstringDataメソッドを通じて使用できる文字の長さ。0であるかもしれなません。つまりCharacterDataノードが空かもしれませn。
substringData (offset, count)
ノードからその範囲のデータを取り出します。

引数: offset 取り出す部分文字列の開始オフセット。 count 取り出す文字数。

戻り値: 指定された部分文字列。offsettとcountの合計が長さを越えたら、データの末尾までの文字がすべて返されます。

appendData (str)
ノードの文字データの末尾に文字列を追加します。成功すると、データはデータとDOMStringとの結合したものへのアクセスを提供します。
insertData (offset, arg)
文字列を指定された文字オフセットに挿入します。

引数: offset 挿入する文字オフセット。 arg 挿入するDOMString。

deleteData (offset, count)
ノードからその範囲の文字を削除します。成功したら、データと長さが変更に反映されます。offsettとcountの合計が長さを越えたら、データの最後までの文字がすべて削除されます。

引数: offset そこから文字を削除するオフセット。 count 削除する文字数。

replaceData (offset, count, arg)
指定された文字オフセットから文字を、指定された文字列で置換します。

引数: offset 置換の開始オフセット。 count 置換する文字数。 arg 範囲を置き換えるDOMString

offsettとcountの合計が長さを越えたら、データの末尾までの文字がすべて置換されます。(つまり、その効果は、同じ範囲で削除(remove)メソッドを呼び出して、後で追加(append)メソッドを呼び出したのと一緒です)


XML::DOM::Attr extends XML::DOM::Node

XML::DOM::Parserにより構築されるAttrノードは、いつも1つの子供ノードを持っています。その子供ノードは展開された文字列値が入っているTextノードです(つまり EntityReferences は常に展開されます)。Documentが変更されたり、新しく作成されたときには、EntityReferencesが追加されるかも知れません。

AttrインターフェースはElementオブジェクトのなかの属性を表わします。典型的にはその属性に設定できる値は、文書タイプ定義のなかで定義されます。

AttrオブジェクトはNodeインタフェースを継承します、しかし実際には修飾する要素の子供ノードではないので、DOMはそれらを文書ツリーの一部であるとは考えません。このため、AttrオブジェクトではNodeの属性、parentNode, previousSibling, nextSiblingはundefになります。DOMは、属性は関連する要素とはべつの存在というよりも、要素のプロパティであるという見方をとります。これにより、あるタイプのすべての要素に関連付けられているデフォルトの属性のような機能を実装することが一層効率がよくできます。さらに、AttrノードはDocumentFragmenの直接の子供になることはできません。しかし、DocumentFragmentに含まれているElementに関連付けることはできます。簡単にいえば、DOMのユーザおよび実装者はAttrノードはNodeインタフェースを継承する他のオブジェクトと共通のものを持っているけれども、とても違ってもいるということに注意する必要があります。

属性の有効な値は以下のようにして決まります: この属性が明確にある値が代入されたら、その値が属性の有効な値です;そうでない場合、この属性の宣言があって、その宣言にデフォルト値があれば、そのデフォルト値が属性の有効な値です。;そうでない場合、属性は構造モデルのなかでは明確に追加されるまで、この要素上に存在しません。AttrインスタンスでのnodeValue属性は属性の値を文字列形式で取得するためにも使えることに注意してください。

XMLでは、属性の値にエンティティ・リファレンスが入ってもよいとき、Attrノードの子供ノードはエンティティ・リファレンスを展開しない表現で提供します。これらの子供ノードはTextまたはEntityReferenceノードのいずれかがなれます。属性タイプがわからないこともあるために、トークン化された属性値はありません。

getValue
取得時、属性の値が文字列として返されます。文字と一般エンティティ・リファレンスがその値で置き換えられます。
setValue (str)
DOMの仕様:設定時、 文字列のパース対象外である内容をもったTextノードを作成します。
getName
この属性の名前を返します。

XML::DOM::Element extends XML::DOM::Node

文書をトラバースするとき作者が出会う圧倒的大多数のオブジェクト(テキストは別にして)は、Elementノードです。以下のXML文書について考えてみてください:

     <elementExample id="demo">
       <subelement1/>
       <subelement2><subsubelement/></subelement2>
     </elementExample>

DOMを使って表わすと、最上位のノードは、「elementExample」のElementノードで、それには2つの子供のElementノードが入っています。1つは「subelement1」、もう1つが「subelement2」です。「subelement1」には子供ノードがありません。

Elementは関連付けられた属性を持つことができます; ElementインタフェースはNodeからの継承しているので、Nodeインタフェースが元からもっているメソッドgetAttributesを使って、そのElementのためのすべての属性の集合体を取り出すことができます。Elementインターフェースには、Attrオブジェクトを名前によって取り出したり、属性の値を名前で取り出すためのメソッドもあります。XMLでは、 属性値にエンティティ・リファレンスを入れることができる場所では、Attrオブジェクトは取り出されて、複雑なサブツリー表現が属性値を表現しているかをできる限り検査されなければなりません。一方、HTMLでは、すべての属性は単純な文字列値をもっているところでは、直接、属性値にアクセスするメソッドを便利に、安全に使うことができます。

getTagName
要素の名前。例えば:
               <elementExample id="demo">
                       ...
               </elementExample>

tagNameは「elementExample」になります。XMLでは、こうして大文字小文字を保つことは、DOMのすべての操作で同じことに注意してください。

getAttribute (name)
名前によって属性を取り出します。

戻り値: Attrの値を文字列で。その属性が指定されていないか、デフォルトの値がなければ、空文字。

setAttribute (name, value)
新しい属性を追加します。その要素にそのnameの属性が既にあれば、その値がvalueパラメータの値に変更されます。このvalueは単純な文字列です、設定されるときにはパースされません。そのためマーク付け(エンティティ・リファレンスとして理解されるような書き方)はリテラル・テキストとして扱われ、そして出力するときには適切にエスケープする必要があります。エンティティ・リファレンスが入っている属性値を代入するためには、ユーザはAttrノードにTextとEntityReferenceノードを加えたものを作成し、適切なサブツリーを構築し、setAttributeNodeを使って属性の値としてそれに代入しなければなりません。

DOMExceptions:

removeAttribute (name)
nameによって属性を削除します。削除された属性がデフォルト値をもっていれば、すぐに置き換えられます。

DOMExceptions:

このノードが読み込み専用のとき、発生します。

getAttributeNode
Attrノードを名前によって取り出します。

戻り値: 指定された属性名のAttrノード。そのような属性がなければundef。

setAttributeNode (attr)
新しい属性を追加します。もし要素にその名前の属性が既にあれば、新しいものによって置き換えます。

戻り値: newAttr属性が既存の同じ名前の属性を置き換えたならば、前から存在していたAttrノード。そうでなければundefが返されます。

DOMExceptions:

removeAttributeNode (oldAttr)
指定された属性を削除します。削除されたAttrがデフォルトの値を持っていれば、すぐに置き換えられます。Attrがすでにデフォルト値であれば、何も起こらず、何も返しません。

 

引数: oldAttr 属性リストから削除するAttrノード

戻り値: 削除されたAttrノード

DOMExceptions:

このノードが読み込み専用のとき、発生します。

oldAttrがこの要素の属性でなければ、発生します。

 

DOMの仕様にはない追加のメソッド

setTagName (newTagName)
Elementのタグ名を設定します。このメソッドはDOMの実装間で移植可能ではないことに注意してください。

DOMExceptions:

  • INVALID_CHARACTER_ERR

    指定された名前に不適切な文字が入っていた場合、発生します。


XML::DOM::Text extends XML::DOM::CharacterData

Textインターフェースは、ElementまたはAttrのテキストの内容(いわばXMLでの文字データ)を表わします。要素の内容に何もマーク付けがなければ、テキストは、要素のたった1つの子供であるTextインターフェースを実装している1つのオブジェクトに入ります。マーク付けがあればそれは、その要素の子供のリストを形成する要素とTextノードのリストへパースされます。

文書がDOMを介して初めて利用可能になったとき、それぞれのテキストのブロックには1つのTextノードしかありません。ユーザは、間に挟まれたマーク付け無しに、与えられた要素の内容を表わすTextノードを隣り合って作成するかもしれません。しかしXMLまたはHTMLで、これらのノードが別れていることを表わす方法がないということに注意しなければなりません。そのため、それらはDOMの編集セッションの間、(通常)生き残りません。 Elementの normalize() メソッドが、そのような隣合ったTextオブジェクトを、テキストのブロック毎に1つのノードにまとめます:特定の文書構造に依存する、XPointersでのナビゲーションのような操作を実行の前に、お勧めします。

実装されていないこと: XML::DOM::ParserはすべてのCDATASectionsを通常のテキストに変換します。そのため、私が知る限り、それを保存する方法はありません。CDATASectionノードをDocumentに追加したとき、それらは保存されます。

splitText (offset)
このTextノードを指定されたオフセットで2つのTextノードに分割します。両方とも兄弟としてツリーに保存されます。このノードはオフセットのことろまでのすべての内容を持ちます。そして新しいTextノード、このノードの次の弟として挿入され、オフセットの位置から後ろの内容が入ります。

引数: offset 分割するオフセット。0から始まる。

戻り値: Textノード

DOMExceptions:

  • INDEX_SIZE_ERR

    指定されたオフセットがマイナスかデータの文字数よりも大きいとき発生します。

  • NO_MODIFICATION_ALLOWED_ERR

    このノードが読み込み専用のとき、発生します。


XML::DOM::Comment extends XML::DOM::CharacterData

これはコメントの内容を表わします。つまり「<!--」で始まり、「 -->」で終わるまでのすべての文字です。HTMLツールの中には完全なSGMLコメント構造を実装しているものもありますが、XMLでは、そして実際にはHTMLでも、これがコメントの定義であることに注意してください。

XML::DOM::CDATASection extends XML::DOM::CharacterData

CDATA セクションは、そうしないとマーク付けとして見られてしまう文字が入ったテキストのエスケープ・ブロックとして使われます。CDATAセクションで認識される唯一のデリミタは、CDATAセクションを終わりにする「]]>」だけ文字列です。CDATA セクションはネストすることはできません。主たる目的は、XMLフラグメントのような材料を、すべてのデリミタをエスケープすることなしに含むことにあります。

TextノードのDOMString属性は、CDATAセクションに入っているテキストを保持します。これがCDATAセクションの外では、エスケープされる必要がのある文字が入っているかもしれず、それはシリアル化のために選ばれた文字のエンコーディング(文字セット)に依存し、CDATAセクションの一部としてある文字を出力することは不可能かもしれないことに注意してください。

CDATASectionインターフェースはTextインターフェースを通じてCharacterDataインターフェースを継承しています。隣合ったCDATASectionsノードはElement.normalize()メソッドにより1つにまとめられることはありません。

未実装: TextノードでのCDATASectionsが、XML入力をパースしたとき、Textノードに変換されることについてのコメントをご覧ください。


XML::DOM::ProcessingInstruction extends XML::DOM::Node

ProcessingInstructionインターフェースは「処理命令」を表わし、XMLでプロセッサ特有の情報を文書のテキストに保存する方法として使われます。例えば:
 <?PI processing instruction?>

ここでは「PI」がターゲットであり、「processing instruction」がデータです。

getTarget
この処理命令のターゲット。XMLはこれを、処理命令を始めるマーク付けの次の先頭のトークンとして定義しています。
getData と setData (data)
この処理命令の内容。ターゲットの後の最初の空白文字でない文字から、?>がつく文字までです。

XML::DOM::Notation extends XML::DOM::Node

このノードは記法を表わします。例:
 <!NOTATION gs SYSTEM "GhostScript">
 <!NOTATION name PUBLIC "pubId">
 <!NOTATION name PUBLIC "pubId" "sysId">
 <!NOTATION name SYSTEM "sysId">
getName と setName (name)
NOTATIONキーワードの後の最初のトークンである記法名を返します(あるいは設定します)。
getSysId と setSysId (sysId)
オプションのSYSTEMキーワードの後のトークンであるシステム識別子を返します(あるいは設定します)。
getPubId と setPubId (pubId)
オプションのPUBLICキーワードの後のトークンである公開識別子を返します(あるいは設定します)。
getBase
XML::ParserによってNatationハンドラのなかで渡されます。これがなんであるかまだわかりません。
getNodeName
getNameと同じものを返します。

XML::DOM::Entity extends XML::DOM::Node

このノードはEntity宣言を表わします。例:
 <!ENTITY % draft 'INCLUDE'>
 <!ENTITY hatch-pic SYSTEM "../grafix/OpenHatch.gif" NDATA gif>

最初のものはパラメータ・エンティティと呼ばれ、%draft;のようにで参照されます。2番目は(通常の)エンティティで、&hatch-pic;のように参照されます。

getNotationName
エンティティのための記法名を返します。

未実装 DOM仕様では: パース対象外エンティティでは記法名。パース対象エンティティではこれはnull(この実装ではパース対象外エンティティをサポートしていません)

getSysId
システム識別子またはundefを返します。
getPubId
公開識別子またはundefを返します。

DOM仕様にはない追加のメソッド

isParameterEntity
パラメータ・エンティティであるか(%ent;)そうでないか(&ent;)
getValue
エンティティの値を返します。
getNdata
(一般的なパース対象外エンティティのための)NDATA宣言またはundefを返します。

XML::DOM::DocumentType extends XML::DOM::Node

各ドキュメントはdoctype属性をもっており、その値はnullまたはDocumentTypeオブジェクトです。DOMレベル1コアでのDocumentTypeインタフェースは文書のために定義されたエンティティのリストへのインターフェースを提供します。これを書いている時点では、名前空間とXMLスキーマによるDTD表現への努力の効果が明確に理解されていないために、他のものはほとんど提供しません。

DOMレベル1はDocumentTypeノードの編集をサポートしていません。

DOM仕様外: この実装はDOMレベル1インタフェースに特別に機能を追加しています。DocumentTypeノードの編集を可能にするためには、XML::DOM::ignoreReadOnlyをご覧ください。

getName
DTDの名前を返します。つまりDOCTYPEキーワードのすぐ後ろの名前を返します。
getEntities
DTDの外部および内部で宣言された一般エンティティが入ったNamedNodeMap。重複するものは捨てられます。例えば:
 <!DOCTYPE ex SYSTEM "ex.dtd" [
  <!ENTITY foo "foo">
  <!ENTITY bar "bar">
  <!ENTITY % baz "baz">
 ]>
 <ex/>

インターフェースは、fooとbarへのアクセスは提供しますが、bazへは提供しません。このマップのすべてのノードはEntityインターフェースを実装します。

DOMレベル1はエンティティの編集をサポートしません。このためどのような方法を使ってもエンティティを変更することはできません。

DOM仕様外: DocumentTypeなどを編集するためには、XML::DOM::ignoreReadOnlyをご覧ください。

getNotations
DTDのなかの記法宣言が入ったNamedNodeMap。重複するものは捨てられます。マップのなかのすべてのノードはNotationインターフェースを実装します。

DOMレベル1は記法の編集をサポートしません。このためどのような方法を使っても記法を変更することはできません。

DOM仕様外: DocumentTypeなどを編集するためには、XML::DOM::ignoreReadOnlyをご覧ください。

DOM仕様にはない追加のメソッド

getSysId
システム識別子を返します。
getPubId
公開識別子を返します。
getAttlistDecl (elemName)
指定された名前のElementのためのAttlistDeclまたはundefを返します。
getElementDecl (elemName)
指定された名前のElementのためのElementDeclまたはundefを返します。
getEntity (entityName)
指定された名前のエンティティまたはundefを返します。
addAttlistDecl (elemName)
まだ存在しなければ、指定されたelemNameの新しいAttlistDeclノードを追加します。AttlistDecl (新しいまたは既存の)ノードを返します。
addElementDecl (elemName, model)
まだ存在しなければ、指定されたelemNameの新しいElementDeclノードを追加します。AttlistDecl (新しいまたは既存の)ノードを返します。もし存在すればmodelは無視されます。
addEntity (parameter, notationName, value, sysId, pubId, ndata)
新しいEntityノードを追加します。これはエンティティが入っている、内部のNamedNodeMapに追加されなければならないので、createEntityとappendChildを使わないでください。

引数: parameter パラメータ・エンティティ(%ent;)か、そうでない(&ent;)か notationName エンティティ名 value エンティティ値sysId (もしあれば)システム識別子 pubId (もしあれば)公開識別子ndata (もしあれば、一般的なパース対象外エンティティのための) NDATA宣言

sysId, pubId, ndataはundefにすることができます。

DOMExceptions:

  • INVALID_CHARACTER_ERR

    notationNameがXMLの仕様にあっていないときに発生します。

addNotation (name, base, sysId, pubId)
新しいNotationオブジェクトを追加します。

引数: name 記法名 base 相対URIを解決するために使われるベース sysId システム識別子 pubId 公開識別子

Base, sysId, pubId はundefにすることができます。 (これら引数はXML::ParserのNotationハンドラによって渡されます)

DOMExceptions:

  • INVALID_CHARACTER_ERR

    notationNameがXMLの仕様にあっていないときに発生します。

addAttDef (elemName, attrName, type, default, fixed)
新しい属性定義を追加します。AttDefノードを、もしあればAttlistDeclに追加します。指定されたelemNameに指定されたattrNameのAttDefが既に存在するならば、この関数は警告を出すだけです。

他の引数についてはXML::DOM::AttDef::newをご覧ください。

getDefaultAttrValue (elem, attr)
文字列でデフォルトの属性を返します。何も使えなければundef。

引数: elem 要素タグ名 attr 属性名

expandEntity (entity [, parameter])
指定されたエンティティまたは、(もしparameter=1ならば)パラメータ・エンティティを展開します。そしてその値を文字列で返します。そのエンティティが存在しなければ、undefを返します。(エンティティ名には「%」「&」や「;」デリミタが入っていてはいけません)。

XML::DOM::DocumentFragment extends XML::DOM::Node

DocumentFragmentは「軽い」あるいは「最小限」のDocumentオブジェクトです。文書のツリーの一部を取り出せるようにしたいとか、文書の新しい一部を作成したいと思うことはとてもよくあることです。文書からその一部分を動かすことにより、切り取りあるいは整理するようなユーザ・コマンドを考えてみてください。そのような一部を保持することができるオブジェクトをもつことは望ましく、そしてこの目的のためにNodeを使うのはとても自然です。Documentオブジェクトはこの役割を十分に満たすことは事実ですが、Documentオブジェクトは潜在的に重いオブジェクトで、それは実装に依存します。ここで本当に必要なのは、とても軽いオブジェクトなのです。DocumentFragmentはそのようなオブジェクトです。

さらに、さまざまな操作 -- 他のノードの子供としてノードを挿入するような -- は、引数としてDocumentFragment オブジェクトをとることもできます; この結果、DocumentFragmentのすべての子供ノードがこのノードの子供リストに移動されます。

DocumentFragmentノードの子供は0個または文書の構造を定義するサブツリーの最上位を表わす複数のノードです。 DocumentFragmentノードはウェル・フォームドなXML文書である必要はありません(しかしウェル・フォームドなXMLパース対象エンティティに課せられた規則に従う必要があります。その規則は複数の最上位ノードをもつことができます。) 例えば、DocumentFragmentはたった1つの子供しかもっておらず、その子供ノードはTextノードかもしれません。このような構造モデルはHTML文書もウェル・フォームドなXML文書のどちらも表わしていません。

DocumentFragmentはDocument (または実際には他の子供を持つことができるNode) に挿入されるとき、DocumentFragmentそれ自身ではなく、DocumentFragmentの子供がそのNodeに挿入されます。このため、ユーザが兄弟のノードを作成するときに、DocumentFragmentは便利です;DocumentFragmentはこれらのノードの親のように振る舞い、そのためユーザはinsertBefore()appendChild()といったNodeインタフェースからの標準のメソッドを使えます。


XML::DOM::DOMImplementation

DOMImplementationインタフェースは文書オブジェクト・モデルの特定のインスタンスには依存しない操作を実現するためのメソッドのいくつか提供します。

DOMレベル1は、文書インスタンスを作成する方法を決めていません。そのため文書作成は実装に特有の操作です。将来のDOM仕様のレベルでは、文書を作成するメソッドを直接提供することが予想されます。

hasFeature (feature, version)
もしfetureが「XML」でversionが「1.0」であれば1を返します。

XML::DOM::Document extends XML::DOM::Node

これが、XML::DOM::Parser::parse と XML::DOM::Parser::parsefile によって返される文書構造の主たるルートです。

要素、Textノード、コメント、処理命令などはDocumentの文脈の外では存在できないため、 Document インタフェースは、これらのオブジェクトを作成するために必要なファクトリ・メソッドももっています。作成されたNodeオブジェクトは、そのオブジェクトをそれが作成された文脈のDocumentに結び付けるgetOwnerDocumentメソッドをもっています。

getDocumentElement
文書のルート要素である子供ノードに直接アクセスするための簡易メソッドです。
getDoctype
この文書に関連付けられた文書タイプ宣言(DocumentTypeを参照)。HTML文書では、文書タイプ宣言のないXML文書と同じように、これはundefを返します。DOM レベル1は、文書タイプ宣言の編集をサポートしていません。

DOM仕様外: この実装では文書タイプの編集を許しています。詳細はXML::DOM::ignoreReadOnly をご覧ください。

getImplementation
この文書を扱うDOMImplementationオブジェクト。DOMアプリケーションは、複数の実装からのオブジェクトを使うことができます。
createElement (tagName)
指定されたタイプの要素を作成します。返されるインスタンスはElementインタフェースを実装しており、そのため返されたオブジェクトに属性を直接指定することができることに注意して下さい。

DOMExceptions:

  • INVALID_CHARACTER_ERR

    tagNameがXMLの仕様にあっていないときに発生します。

createTextNode (data)
指定された文字列でTextノードを作成します。
createComment (data)
指定された文字列でCommentノードを作成します。
createCDATASection (data)
指定された文字列でCDATASectionノードを作成します。
createAttribute (name [, value [, specified ]])
指定された名前のAttrを作成します。AttrインスタンスはsetAttributeメソッドを使ってElementに設定できることに注意してください。

DOM仕様外: DOM仕様では、このメソッドで値または特定のプロパティを渡すことを許していません。この実装では、それらはオプションです。

引数: value 属性の値。詳細はAttr::setValueをご覧ください。もし値が指定されなければ、指定されたプロパティは0に設定されます。 specified 属性値が指定されたか、デフォルト値が使われたか。与えられなければ、1であるかのようになります。

DOMExceptions:

  • INVALID_CHARACTER_ERR

    nameがXMLの仕様にあっていないときに発生します。

createProcessingInstruction (target, data)
指定された名前、data文字列のProcessingInstructionノードを作成します。

引数: target 処理命令のターゲット部分 data そのノードのデータ

DOMExceptions:

  • INVALID_CHARACTER_ERR

    targetがXMLの仕様にあっていないときに発生します。

createDocumentFragment
空のDocumentFragmentオブジェクトを作成します。
createEntityReference (name)
EntityReferenceオブジェクトを作成します。

DOM仕様にはない追加のメソッド

getXMLDecl and setXMLDecl (xmlDecl)
このDocumentのためのXMLDecl。何も指定されていなければundef。XMLDeclが子供ノードのリストの一部でないことに注意してください。
setDoctype (doctype)
DocumentTypeを設定あるいは置き換えます。 注意: DocumentTypeを設定するために、appendChild または insertBeforeを使わないでください。doctypeはたとえ子供ノードのリストの一部であっても、特別に扱われます。
getDefaultAttrValue (elem, attr)
デフォルトの属性値を文字列で返します。何も使えなければundefが返されます。

引数: elem 要素のtagName attr 属性の名前

getEntity (name)
指定されたnameのEntityを返します。
createXMLDecl (version, encoding, standalone)
XMLDeclオブジェクトを作成します。すべてのパラメータをundefにすることができます。
createNotation (name, base, sysId, pubId)
新しいNotationオブジェクトを作成します。XML::DOM::DocumentType::addNotationを使うことを考えてください!
createEntity (parameter, notationName, value, sysId, pubId, ndata)
Entityオブジェクトを作成します。XML::DOM::DocumentType::addEntityを使うことを考えてください!
createElementDecl (name, model)
ElementDeclオブジェクトを作成します。

DOMExceptions:

  • INVALID_CHARACTER_ERR

    要素名(タグ名)がXMLの仕様にあっていないときに発生します。

createAttlistDecl (name)
AttlistDeclオブジェクトを作成します。

DOMExceptions:

  • INVALID_CHARACTER_ERR

    要素名(タグ名)がXMLの仕様にあっていないときに発生します。

expandEntity (entity [, parameter])
指定されたエンティティまたは、(もしparameter=1ならば)パラメータ・エンティティを展開します。そしてその値を文字列で返します。そのエンティティが存在しなければ、undefを返します。(エンティティ名には「%」「&」や「;」デリミタが入っていてはいけません)。

特殊なノードタイプ

XML::DOM::XMLDecl extends XML::DOM::Node

このノードはXML宣言を含みます。例えば:
 <?xml version="1.0" encoding="UTF-16" standalone="yes"?>

XML::DOM::Document::getXMLDeclもご覧ください。

getVersion と setVersion (version)
XMLバージョンの返すあるいは設定します。書き出すときに、バージョンは常に「1.0」になります。
getEncoding と setEncoding (encoding)
encodingの値にはundefを指定することもできます。
getStandalone と setStandalone (standalone)
standaloneの値にはundefを指定することもできます。

XML::DOM::ElementDecl extends XML::DOM::Node

このノードは要素宣言を表わします。例:
 <!ELEMENT address (street+, city, state, zip, country?)>
getName
要素タグ名を返します。
getModel と setModel (model)
モデルを文字列で返すあるいは設定します。例えば、上記の例では 「(street+, city, state, zip, country?)」となります。

XML::DOM::AttlistDecl extends XML::DOM::Node

このノードはATTLIST 宣言を表わします。例:

 <!ATTLIST person
   sex      (male|female)  #REQUIRED
   hair     CDATA          "bold"
   eyes     (none|one|two) "two"
   species  (human)        #FIXED "human"> 

各属性定義はAttDefノードに分割されて保存されます。AttDefノードはgetAttDefで取り出し、addAttDefで追加することができます。(AttDefノードは内部ではNamedNodeMapに格納されます)

getName
Element タグ名を返します。
getAttDef (attrName)
指定された名前をもった属性のためのAttDef ノードを返します。
addAttDef (attrName, type, default, [ fixed ])
指定された名前の属性のためのAttDefノードを追加します。

引数: attrName 属性の名前。 type 属性のタイプ(例えば、「CDATA」または「(male|female)」) default デフォルト値をクォート(!)で囲んだもの。文字列#IMPLIEDまたは文字列 #REQUIRED. fixed その属性が固定値('#FIXED')かどうか (デフォルトは0)


XML::DOM::AttDef extends XML::DOM::Node

このクラスの各オブジェクトはAttlistDeclのなかの1つの属性を表わします。
getName
属性の名前を返します。
getDefault
デフォルト値またはundefを返します。
isFixed
属性の値が固定値(#FIXED キーワードを参照) かどうか。
isRequired
属性の値が必須(#REQUIRED キーワードを参照) かどうか。
isImplied
属性値省略された場合にアプリケーションに何の属性値も渡さない(#IMPLIEDキーワードを参照) かどうか。

実装の詳細


参考資料

DOM レベル1 仕様 http://www.w3.org/TR/REC-DOM-Level-1

XML 仕様 (Extensible Markup Language 1.0) http://www.w3.org/TR/REC-xml

XML::Parser と XML::Parser::Expatマニュアル・ページ。


注意事項

メソッド getElementsByTagName() は「生きた」NodeListを返しませんこれは話し合いの余地のある注意事項ですが、XML-DOMメーリングリストではあまり多くの人がそのように思っていないようです。私はまだ決心していません。実装するのは大変で、遅くなり、利点はそれほどないように見えます。どのように考えているかを教えてください。


作者

Enno Derksen <enno@att.com> と Clark Cooper <coopercl@sch.ge.com>. バグ、コメント、提案はEnnoにメールをください。


ホーム Perlの小技

ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。