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 CooperのXML::Parserモジュールを拡張しています。James Clarkのexpatライブラリへの下位レベルのインターフェースであるXML::Parser::Expatの上にXML::Parserモジュールは作られています。
XML::DOM::ParserはXML::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::DOMをversion 2.19以降のXML::Parserと一緒に使い、XML::DOM::ParserオプションのKeepCDATAを 1に設定すると、Textノードに変換するのではなく、CDATASectionをCDATASectionノードに格納します。 後に続く、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での属性の定義に対応)です。
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つの追加されたノードクラスをサポートするために追加されています。
ignoreReadOnlyメソッドはグローバルのIgnoreReadOnlyを設定し、その直前の値を返します。getIgnoreReadOnlyメソッドは単に現在の値を返します。
my $oldIgnore = XML::DOM::ignoreReadOnly (1);
eval {
... 他の例外を受けながら、やりたいことをします
};
XML::DOM::ignoreReadOnly ($oldIgnore); # 前の値に戻します
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は抜けがないように追加しました。
注意: この実装ではgetElementsByTagNameでは「生きた」NodeListを返しません。 注意事項をご覧下さい。.
このメソッドがリストコンテキストで呼ばれると、子供のノードが入った通常のPerlのリストを返します。このリストは「生きて」ないことに注意して下さい。 例えば:.
@list = $node->getChildNodes; # Perlのリストを返します $nodelist = $node->getChildNodes; # NodeList (オブジェクト・リファレンス)を返します for my $kid ($node->getChildNodes) # $nodeの子供を繰り返します
newChildがDocumentFragmentオブジェクトであれば、その子供が同じ順序で、refChildの前にすべて挿入されます。newChildがツリーの中にすでに入っていれば、最初に削除されます。
戻り値: 挿入されたノード
DOMExceptions:
このノードのタイプがnewChildノードのタイプの子供を許さないか、挿入するノードがこのノードの祖先であるとき発生します。
newChildがこのノードを作成したものとは違う文書から作成されたとき発生します。
このノードが読み込み専用のとき、発生します。
refChildがこのノードの子供でないと発生します。
戻り値: 置き換えられたノード
DOMExceptions:
このノードがnewChildのタイプの子供を持つことを許さないタイプであるか、入れるノードがこのノードの祖先であるとき発生します。
newChildがこのノードを作成したものとは違う文書から作成されたとき発生します。
このノードが読み込み専用のとき、発生します。
oldChildがこのノードの子供でないと発生します。
戻り値: 削除されたノード
DOMExceptions:
このノードがnewChildのタイプの子供を持つことを許さないタイプであるか、入れるノードがこのノードの祖先であるとき発生します。(訳者注:間違いのようだ)
newChildがこのノードを作成したものとは違う文書から作成されたとき発生します。(訳者注:間違いのようだ)
このノードが読み込み専用のとき、発生します。
oldChildがこのノードの子供でないと発生します。
戻り値: 追加されたノード
DOMExceptions:
このノードがnewChildのタイプの子供を持つことを許さないタイプであるか、入れるノードがこのノードの祖先であるとき発生します。
newChildがこのノードを作成したものとは違う文書から作成されたとき発生します。
このノードが読み込み専用のとき、発生します。
戻り値: 子供があれば1、そうでなければ0。
Elementを複写すると、すべての属性とその値がコピーされます。これにはデフォルトの属性を表わすためにXMLプロセッサが作成したものも含まれます。しかしこのメソッドはdeepを指定しなければ、それが持っているテキストはなにもコピーしません。というのもテキストは子供のTextノードに入っているからです。他のノードのタイプは単純に、ノードのコピーを返します。
引数: deep もしtrueであれば、指定されたノードの下をサブツリーを再帰的に複写します。Falseであえれば、そのノード自身を複写します(もしElementであればその属性も)。
戻り値: 複写されたノード
DOM仕様外: DOMの仕様では、このメソッドはElementとDocumentクラスインターフェースの中だけで定義されています。しかし、ここで持ってもさしさわりがないかと....
引数: 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)
- 文字列中のすべてのエンティティ・リファレンスを展開し、その結果を返します。エンティティ・リファレンスは文字リファレンス(例: 「{」または「ῂ」)、デフォルトのエンティティ・リファレンス(「"」、「>」、「<」、「'」、「&」)、または所有しているDocumentのDocumentTypeの一部としてEntityオブジェクトの中で定義されたエンティティ・リファレンスがあります。文字リファレンスはUTF-8に展開されます。パラメータ・エンティティ・リファレンス(例 %ent;) は展開されません。
NodeListに入っているアイテムは0から始まる整数のインデックスを通じてアクセスすることができます。
DOMの仕様ではすべてのNoldeListは「生きている」つまり、常にDOMツリーへ変更を反映するように記述されてますが、getElemnetsByTagNameによって返されるNodeListはこの実装では「生きて」いません。詳細については注意事項 をご覧ください。
この実装では、NamedNodeMapに追加されたオブジェクトは順番を保っていることに注意してください。
戻り値: 指定された名前の(すべてのタイプの)ノード。指定されたnameがマップのなかになければundef。
nodeName属性がノードがそのもとに格納される名前を引き出すために使われるので、(「特殊な」文字列値を持っている)ある種の複数のノードは、名前が壊れてしまうために格納できません。このことはノードに別名を許すよりも望ましいように思います。
引数: arg NamedNodeMapに格納するノード。
このノードは後で、このノードのnodeName属性の値を使ってアクセスできるようになります。その名前のノードがすでにマップにあれば、新しいもので置き換えられます。
戻り値: 新しいノードがすでにある同じ名前のノードを置き換えれば、その前から存在するノードを返します。そうでなければundefを返します。
DOMExceptions:
argがこのNameNodeMapを作成したものとは違う文書から作成されたとき発生します。
このNamedNodeMapが読み込み専用のとき、発生します。
引数が既にほかのElementオブジェクトの属性になっているAttrのとき発生します。他の要素で再利用するためには、DOMユーザは明示的にAttrノードの複写しなければいけません。
戻り値: マップから削除されたノード。そのような名前のノードがなければundef。
DOMException:
このマップに指定された名前のノードがないとき発生します。
戻り値: NamedNodeMapでの指定された位置のノード。適切なindexでなければundef。
このメソッドがリスト・コンテキストで呼ばれると、値が入った通常のPerlリストを返します。このリストは「生きていない」ことに注意してください。例:
@list = $map->getValues; # Perlのリストを返します。 $nodelist = $map->getValues; # NodeList(オブジェクトのリファレンス)を返します for my $val ($map->getValues) # 値で繰り返します
引数: offset 取り出す部分文字列の開始オフセット。 count 取り出す文字数。
戻り値: 指定された部分文字列。offsettとcountの合計が長さを越えたら、データの末尾までの文字がすべて返されます。
引数: offset 挿入する文字オフセット。 arg 挿入するDOMString。
引数: offset そこから文字を削除するオフセット。 count 削除する文字数。
引数: offset 置換の開始オフセット。 count 置換する文字数。 arg 範囲を置き換えるDOMString
offsettとcountの合計が長さを越えたら、データの末尾までの文字がすべて置換されます。(つまり、その効果は、同じ範囲で削除(remove)メソッドを呼び出して、後で追加(append)メソッドを呼び出したのと一緒です)
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ノードのいずれかがなれます。属性タイプがわからないこともあるために、トークン化された属性値はありません。
文書をトラバースするとき作者が出会う圧倒的大多数のオブジェクト(テキストは別にして)は、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:
- INVALID_CHARACTER_ERR
指定された名前に不適切な文字が入っていると発生します。
- NO_MODIFICATION_ALLOWED_ERR
このノードが読み込み専用のとき、発生します。
- removeAttribute (name)
- nameによって属性を削除します。削除された属性がデフォルト値をもっていれば、すぐに置き換えられます。
DOMExceptions:
- NO_MODIFICATION_ALLOWED_ERR
このノードが読み込み専用のとき、発生します。
- getAttributeNode
- Attrノードを名前によって取り出します。
戻り値: 指定された属性名のAttrノード。そのような属性がなければundef。
- setAttributeNode (attr)
- 新しい属性を追加します。もし要素にその名前の属性が既にあれば、新しいものによって置き換えます。
戻り値: newAttr属性が既存の同じ名前の属性を置き換えたならば、前から存在していたAttrノード。そうでなければundefが返されます。
DOMExceptions:
- WRONG_DOCUMENT_ERR
newAttrがこの要素を作成したものとは違う文書から作成されたとき発生します。
- NO_MODIFICATION_ALLOWED_ERR
このノードが読み込み専用のとき、発生します。
- INUSE_ATTRIBUTE_ERR
newAttrが既に他のElementオブジェクトの属性であるとき発生します。DOMユーザは、Attrノードを他の要素で再利用するためには、明示的に複写しなければいけません。
- removeAttributeNode (oldAttr)
- 指定された属性を削除します。削除されたAttrがデフォルトの値を持っていれば、すぐに置き換えられます。Attrがすでにデフォルト値であれば、何も起こらず、何も返しません。
引数: oldAttr 属性リストから削除するAttrノード
戻り値: 削除されたAttrノード
- DOMExceptions:
- NO_MODIFICATION_ALLOWED_ERR
このノードが読み込み専用のとき、発生します。
- NOT_FOUND_ERR
oldAttrがこの要素の属性でなければ、発生します。
DOMの仕様にはない追加のメソッド
- setTagName (newTagName)
- Elementのタグ名を設定します。このメソッドはDOMの実装間で移植可能ではないことに注意してください。
DOMExceptions:
- INVALID_CHARACTER_ERR
指定された名前に不適切な文字が入っていた場合、発生します。
文書がDOMを介して初めて利用可能になったとき、それぞれのテキストのブロックには1つのTextノードしかありません。ユーザは、間に挟まれたマーク付け無しに、与えられた要素の内容を表わすTextノードを隣り合って作成するかもしれません。しかしXMLまたはHTMLで、これらのノードが別れていることを表わす方法がないということに注意しなければなりません。そのため、それらはDOMの編集セッションの間、(通常)生き残りません。
Elementの normalize()
メソッドが、そのような隣合ったTextオブジェクトを、テキストのブロック毎に1つのノードにまとめます:特定の文書構造に依存する、XPointersでのナビゲーションのような操作を実行の前に、お勧めします。
実装されていないこと: XML::DOM::ParserはすべてのCDATASectionsを通常のテキストに変換します。そのため、私が知る限り、それを保存する方法はありません。CDATASectionノードをDocumentに追加したとき、それらは保存されます。
引数: offset 分割するオフセット。0から始まる。
戻り値: Textノード
DOMExceptions:
指定されたオフセットがマイナスかデータの文字数よりも大きいとき発生します。
このノードが読み込み専用のとき、発生します。
TextノードのDOMString属性は、CDATAセクションに入っているテキストを保持します。これがCDATAセクションの外では、エスケープされる必要がのある文字が入っているかもしれず、それはシリアル化のために選ばれた文字のエンコーディング(文字セット)に依存し、CDATAセクションの一部としてある文字を出力することは不可能かもしれないことに注意してください。
CDATASectionインターフェースはTextインターフェースを通じてCharacterDataインターフェースを継承しています。隣合ったCDATASectionsノードはElement.normalize()メソッドにより1つにまとめられることはありません。
未実装: TextノードでのCDATASectionsが、XML入力をパースしたとき、Textノードに変換されることについてのコメントをご覧ください。
<?PI processing instruction?>
ここでは「PI」がターゲットであり、「processing instruction」がデータです。
<!NOTATION gs SYSTEM "GhostScript">
<!NOTATION name PUBLIC "pubId">
<!NOTATION name PUBLIC "pubId" "sysId">
<!NOTATION name SYSTEM "sysId">
<!ENTITY % draft 'INCLUDE'>
<!ENTITY hatch-pic SYSTEM "../grafix/OpenHatch.gif" NDATA gif>
最初のものはパラメータ・エンティティと呼ばれ、%draft;のようにで参照されます。2番目は(通常の)エンティティで、&hatch-pic;のように参照されます。
未実装 DOM仕様では: パース対象外エンティティでは記法名。パース対象エンティティではこれはnull(この実装ではパース対象外エンティティをサポートしていません)
DOMレベル1はDocumentTypeノードの編集をサポートしていません。
DOM仕様外: この実装はDOMレベル1インタフェースに特別に機能を追加しています。DocumentTypeノードの編集を可能にするためには、XML::DOM::ignoreReadOnlyをご覧ください。
<!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をご覧ください。
DOMレベル1は記法の編集をサポートしません。このためどのような方法を使っても記法を変更することはできません。
DOM仕様外: DocumentTypeなどを編集するためには、XML::DOM::ignoreReadOnlyをご覧ください。
引数: parameter パラメータ・エンティティ(%ent;)か、そうでない(&ent;)か notationName エンティティ名 value エンティティ値sysId (もしあれば)システム識別子 pubId (もしあれば)公開識別子ndata (もしあれば、一般的なパース対象外エンティティのための) NDATA宣言
sysId, pubId, ndataはundefにすることができます。
DOMExceptions:
notationNameがXMLの仕様にあっていないときに発生します。
引数: name 記法名 base 相対URIを解決するために使われるベース sysId システム識別子 pubId 公開識別子
Base, sysId, pubId はundefにすることができます。 (これら引数はXML::ParserのNotationハンドラによって渡されます)
DOMExceptions:
notationNameがXMLの仕様にあっていないときに発生します。
他の引数についてはXML::DOM::AttDef::newをご覧ください。
引数: elem 要素タグ名 attr 属性名
さらに、さまざまな操作 -- 他のノードの子供としてノードを挿入するような -- は、引数としてDocumentFragment オブジェクトをとることもできます; この結果、DocumentFragmentのすべての子供ノードがこのノードの子供リストに移動されます。
DocumentFragmentノードの子供は0個または文書の構造を定義するサブツリーの最上位を表わす複数のノードです。 DocumentFragmentノードはウェル・フォームドなXML文書である必要はありません(しかしウェル・フォームドなXMLパース対象エンティティに課せられた規則に従う必要があります。その規則は複数の最上位ノードをもつことができます。) 例えば、DocumentFragmentはたった1つの子供しかもっておらず、その子供ノードはTextノードかもしれません。このような構造モデルはHTML文書もウェル・フォームドなXML文書のどちらも表わしていません。
DocumentFragmentはDocument (または実際には他の子供を持つことができるNode)
に挿入されるとき、DocumentFragmentそれ自身ではなく、DocumentFragmentの子供がそのNodeに挿入されます。このため、ユーザが兄弟のノードを作成するときに、DocumentFragmentは便利です;DocumentFragmentはこれらのノードの親のように振る舞い、そのためユーザはinsertBefore()やappendChild()といったNodeインタフェースからの標準のメソッドを使えます。
DOMレベル1は、文書インスタンスを作成する方法を決めていません。そのため文書作成は実装に特有の操作です。将来のDOM仕様のレベルでは、文書を作成するメソッドを直接提供することが予想されます。
要素、Textノード、コメント、処理命令などはDocumentの文脈の外では存在できないため、 Document インタフェースは、これらのオブジェクトを作成するために必要なファクトリ・メソッドももっています。作成されたNodeオブジェクトは、そのオブジェクトをそれが作成された文脈のDocumentに結び付けるgetOwnerDocumentメソッドをもっています。
DOM仕様外: この実装では文書タイプの編集を許しています。詳細はXML::DOM::ignoreReadOnly をご覧ください。
DOMExceptions:
tagNameがXMLの仕様にあっていないときに発生します。
DOM仕様外: DOM仕様では、このメソッドで値または特定のプロパティを渡すことを許していません。この実装では、それらはオプションです。
引数: value 属性の値。詳細はAttr::setValueをご覧ください。もし値が指定されなければ、指定されたプロパティは0に設定されます。 specified 属性値が指定されたか、デフォルト値が使われたか。与えられなければ、1であるかのようになります。
DOMExceptions:
nameがXMLの仕様にあっていないときに発生します。
引数: target 処理命令のターゲット部分 data そのノードのデータ
DOMExceptions:
targetがXMLの仕様にあっていないときに発生します。
引数: elem 要素のtagName attr 属性の名前
DOMExceptions:
要素名(タグ名)がXMLの仕様にあっていないときに発生します。
DOMExceptions:
要素名(タグ名)がXMLの仕様にあっていないときに発生します。
<?xml version="1.0" encoding="UTF-16" standalone="yes"?>
XML::DOM::Document::getXMLDeclもご覧ください。
<!ELEMENT address (street+, city, state, zip, country?)>
このノードは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)
- Perlでのマッピング
DOMの仕様でnullといわれたところでは、undefを使っています。
DOM仕様では: アプリケーションはDOMStringをUTF-16を使ってエンコーディングしなければなりません(Appendix C.3 of [UNICODE] と Amendment 1 of [ISO-10646]で定義)。この実装ではUTF-16の代りにUTF-8でエンコードされた古い普通のPerl文字列を使っています。
- Text と CDATASection ノード
ExpatパーサーはEntityReferencesとCDataSectionセクションを生の文字列に展開し、見つかったところを示しません。このため、この実装ではパースのときに両方ともTextノードに変換します。既にあるDocumentに(ユーザによって)追加されたCDATASectionとEntityReferenceノードは保持されます。
また、末尾のTextノードはパースの時点で、常に1つにまとめられます。後から追加されたTextノードはnormalizeメソッドによって1つにまとめることができます。Textノードを追加するときにはaddTextメソッドを使うことを考えてください。
- 出力と文字列化(Printing and toString)
出力時(そしてXML Documentを文字列に変換するとき)、文字列は、どこで発生したかによって、異なったエンコードをする必要があります。例えば、CDATASectionでは、「]]>」を除く、すべての文字列が許されています。通常のテキストでは、ある文字は許されません。例えば「>」は「>」に変換されなければいけません。これらのルーチンは、詳細を知っているだれかによって検査されなければなりません。
- UTF-8
PerlがUTF-8を正規表現でサポートしたとき、XML::DOM::isValidNameメソッドを非ASCII文字も許すように更新しなければいけません。
- クォート(Quotes)
XMLのある部分は、要素の属性値のように、クォートされます。XML::Parserはこれらのクォートを取り除き、この実装のprintメソッドは常にダブル・クォートを使います。そのため文書のパースと出力のとき、シングル・クォートはダブル・クォートに変換されるかもしれません。しかしながらAttlistDeclでの属性定義(AttDef)のデフォルト値は、そのクォートを維持します。
- AttlistDecl
1つのElementのための属性宣言はつねに1つのAttlistDeclオブジェクトにまとめられます。
- コメント(=Comments)
DOCTYPEセクションでのコメント(=Comments)は正しい位置を保ちません。これらはDocumentの子供ノードになります。
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にメールをください。
ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。