I developed a group of functions that make it very easy to extract any information you want from any page you load from the internet. All based on the DOMDocument object.
You can read the entire documentation and download the source code here:
http://www.tintetoner-shop.de/DomUtilities/
Enjoy !!
DOM 関数
導入
DOM 拡張モジュールを使用すると、DOM API を使用した XML ドキュメントの操作を PHP 5 で行えます。
PHP 4 では DOM XML を使用します。
注意: DOM 拡張モジュールは UTF-8 エンコーディングを使用します。ISO-8859-1 エンコーディングのテキストを扱うには utf8_encode() と utf8_decode() を使用します。またその他のエンコーディングを扱うには Iconv を使用します。
インストール手順
PHP コアに含まれるため、 追加のインストール無しで使用できます。
定義済みクラス
このモジュールの API は、» DOM Level 3 の標準規格と可能な限り 一致させています。そのため、API は完全にオブジェクト指向となっています。 このモジュールを使用する際は、DOM 標準規格を意識することが大切です。
このモジュールで定義されている多くのクラスについて以下の表で説明します。 DOM 標準規格に相当するクラスについては DOMxxx という名前がつけられています。
DOMAttr
DOMNode を継承します。DOMAttr インターフェースは、DOMElement オブジェクトの 属性を表します。
コンストラクタ
-
DOMAttr->__construct() - 新しい DOMAttr オブジェクトを作成する
メソッド
-
DOMAttr->isId() - 属性が定義済みの ID であるかどうかを調べる
プロパティ
| 名前 | 型 | 読み込み専用 | 説明 |
|---|---|---|---|
| name | string | yes | 属性の名前 |
| ownerElement | DOMElement | yes | 属性を保持する要素 |
| schemaTypeInfo | bool | yes | 未実装です。常に NULL を返します。 |
| specified | bool | yes | 未実装です。常に NULL を返します。 |
| value | string | no | 属性の値 |
DOMCharacterData
DOMNode を継承します。
メソッド
-
DOMCharacterData->appendData() - ノードの文字データの最後に文字列を追加する
-
DOMCharacterData->deleteData() - 指定した範囲の文字列をノードから削除する
-
DOMCharacterData->insertData() - 指定した 16 ビット単位のオフセットに、文字列を挿入する
-
DOMCharacterData->replaceData() - DOMCharacterData ノードの文字列の一部を置換する
-
DOMCharacterData->substringData() - ノードから指定した範囲のデータを抽出する
プロパティ
| 名前 | 型 | 読み込み専用 | 説明 |
|---|---|---|---|
| data | string | no | ノードの内容 |
| length | int | yes | 内容の長さ |
DOMDocument
DOMNode を継承します。
コンストラクタ
-
DOMDocument->__construct() - 新しい DOMDocument オブジェクトを作成する
メソッド
-
DOMDocument->createAttribute() - 新しい属性を作成する
-
DOMDocument->createAttributeNS() - 関連付けられた名前空間に新しい属性を作成する
-
DOMDocument->createCDATASection() - 新しい cdata ノードを作成する
-
DOMDocument->createComment() - 新しい comment ノードを作成する
-
DOMDocument->createDocumentFragment() - 新しい文書片を作成する
-
DOMDocument->createElement() - 新しい要素ノードを作成する
-
DOMDocument->createElementNS() - 関連付けられた名前空間に新しい要素ノードを作成する
-
DOMDocument->createEntityReference() - 新しいエンティティ参照ノードを作成する
-
DOMDocument->createProcessingInstruction() - 新しい PI ノードを作成する
-
DOMDocument->createTextNode() - 新しいテキストノードを作成する
-
DOMDocument->getElementById() - id に対応する要素を検索する
-
DOMDocument->getElementsByTagName() - 指定したタグ名に対応するすべての要素を検索する
-
DOMDocument->getElementsByTagNameNS() - 指定した名前空間で、タグ名に対応するすべての要素を検索する
-
DOMDocument->importNode() - 現在のドキュメントにノードをインポートする
-
DOMDocument->load() - ファイルから XML を読み込む
-
DOMDocument->loadHTML() - 文字列から HTML を読み込む
-
DOMDocument->loadHTMLFile() - ファイルから HTML を読み込む
-
DOMDocument->loadXML() - 文字列から XML を読み込む
-
DOMDocument->normalizeDocument() - ドキュメントを正規化する
-
DOMDocument->relaxNGValidate() - ドキュメントを relaxNG で検証する
-
DOMDocument->relaxNGValidateSource() - ドキュメントを relaxNG で検証する
-
DOMDocument->registerNodeClass() - 基底ノード型の作成に使用する拡張クラスを登録する (DOM 標準ではありません)
-
DOMDocument->save() - 内部の XML ツリーをファイルに出力する
-
DOMDocument->saveHTML() - 内部のドキュメントを HTML 形式の文字列として出力する
-
DOMDocument->saveHTMLFile() - 内部のドキュメントを HTML 形式でファイルに出力する
-
DOMDocument->saveXML() - 内部の XML ツリーを文字列として出力する
-
DOMDocument->schemaValidate() - スキーマに基づいてドキュメントを検証する
-
DOMDocument->schemaValidateSource() - スキーマに基づいてドキュメントを検証する
-
DOMDocument->validate() - DTD に基づいてドキュメントを検証する
-
DOMDocument->xinclude() - DOMDocument オブジェクト内の XIncludes を置換する
プロパティ
| 名前 | 型 | 読み込み専用 | 説明 |
|---|---|---|---|
| actualEncoding | string | yes | |
| config | DOMConfiguration | yes | |
| doctype | DOMDocumentType | yes | このドキュメントに関連付けられた文書型宣言 |
| documentElement | DOMElement | yes | ドキュメントの子ノードであるドキュメント要素に対し、 直接アクセスするために便利な属性 |
| documentURI | string | no | ドキュメントの位置。未定義の場合は NULL |
| encoding | string | no | |
| formatOutput | bool | no | |
| implementation | DOMImplementation | yes | このドキュメントを処理する DOMImplementation オブジェクト |
| preserveWhiteSpace | bool | no | 余分な空白を取り除かない。デフォルトは TRUE |
| recover | bool | no | |
| resolveExternals | bool | no | 文書型宣言で外部エンティティを読み込む際に TRUE を設定する。 XML ドキュメントに文字エンティティを含める際に便利です。 |
| standalone | bool | no | |
| strictErrorChecking | bool | no | エラー時に DOMException をスローする。デフォルトは TRUE |
| substituteEntities | bool | no | |
| validateOnParse | bool | no | DTD を読み込んで検証する。デフォルトは FALSE |
| version | string | no | |
| xmlEncoding | string | yes | XML 宣言の一部として、このドキュメントのエンコーディングを 指定する属性。指定されていない場合や不明な場合 (たとえば ドキュメントがメモリ上に存在する場合など) は NULL |
| xmlStandalone | bool | no | XML 宣言の一部として、このドキュメントがスタンドアローンか どうかを指定する。指定されていない場合は FALSE |
| xmlVersion | string | no | XML 宣言の一部として、このドキュメントのバージョン番号を指定する。 バージョン番号が定義されておらず、ドキュメントが "XML" の機能を サポートしている場合は、値は "1.0" |
DOMDocumentFragment
DOMNode を継承します。
メソッド
-
DOMDocumentFragment->appendXML() - 生の XML データを追加する (DOM 標準ではありません)
DOMDocumentType
DOMNode を継承します。
各 DOMDocument は doctype 属性を保持しており、その値は NULL あるいは DOMDocumentType オブジェクトです。
プロパティ
| 名前 | 型 | 読み込み専用 | 説明 |
|---|---|---|---|
| publicId | string | yes | 外部サブセットの公開 ID |
| systemId | string | yes | 外部サブセットのシステム ID。完全 URI である場合とそうでない場合がある。 |
| name | string | yes | DTD の名前。すなわち、DOCTYPE キーワードに続く値 |
| entities | DOMNamedNodeMap | yes | DTD で宣言されている一般エンティティ (外部・内部とも) を含む DOMNamedNodeMap |
| notations | DOMNamedNodeMap | yes | DTD で宣言されている記法を含む DOMNamedNodeMap |
| internalSubset | string | yes | 内部サブセットを文字列として取得する。存在しない場合は null となる。区切りの角括弧は含まない。 |
DOMElement
DOMNode を継承します。
コンストラクタ
-
DOMElement->__construct() - 新しい DOMElement オブジェクトを作成する
メソッド
-
DOMElement->getAttribute() - 属性の値を返す
-
DOMElement->getAttributeNode() - 属性ノードを返す
-
DOMElement->getAttributeNodeNS() - 属性ノードを返す
-
DOMElement->getAttributeNS() - 属性の値を返す
-
DOMElement->getElementsByTagName() - タグ名から要素を取得する
-
DOMElement->getElementsByTagNameNS() - 名前空間 URI とローカル名から要素を取得する
-
DOMElement->hasAttribute() - 属性が存在するかどうかを調べる
-
DOMElement->hasAttributeNS() - 属性が存在するかどうかを調べる
-
DOMElement->removeAttribute() - 属性を削除する
-
DOMElement->removeAttributeNode() - 属性を削除する
-
DOMElement->removeAttributeNS() - 属性を削除する
-
DOMElement->setAttribute() - 新しい属性を追加する
-
DOMElement->setAttributeNode() - 新しい属性ノードを要素に追加する
-
DOMElement->setAttributeNodeNS() - 新しい属性ノードを要素に追加する
-
DOMElement->setAttributeNS() - 新しい属性を追加する
-
DOMElement->setIdAttribute() - ID 属性を宣言する
-
DOMElement->setIdAttributeNode() - ID 属性を宣言する
-
DOMElement->setIdAttributeNS() - ID 属性を宣言する
プロパティ
| 名前 | 型 | 読み込み専用 | 説明 |
|---|---|---|---|
| schemaTypeInfo | bool | yes | 未実装。常に NULL を返す。 |
| tagName | string | yes | 要素名 |
DOMEntity
DOMNode を継承します。
このインターフェースは、XML ドキュメント内の既知のエンティティを表します。 パース済みかどうかは関係ありません。
プロパティ
| 名前 | 型 | 読み込み専用 | 説明 |
|---|---|---|---|
| publicId | string | yes | エンティティに関連付けられているパブリック ID が存在すればその値、 それ以外の場合は NULL |
| systemId | string | yes | エンティティに関連付けられているシステム ID が存在すればその値、 それ以外の場合は NULL。これは完全な URI かもしれないし、 そうでないかもしれない。 |
| notationName | string | yes | パースされていないエンティティの場合はそのエンティティの名前、 パース済みのエンティティの場合は NULL |
| actualEncoding | string | no | 外部でパースされたエンティティの場合は、このエンティティの パース時に使用されたエンコーディングを指定する属性。内部 サブセットからのエンティティであったり未知のエンティティで あった場合は NULL |
| encoding | string | yes | 外部でパースされたエンティティの場合は、テキスト宣言の一部として このエンティティのエンコーディングを指定する属性。それ以外の 場合は NULL |
| version | string | yes | 外部でパースされたエンティティの場合は、テキスト宣言の一部として このエンティティのバージョン番号を指定する属性。それ以外の場合は NULL |
DOMEntityReference
DOMNode を継承します。
コンストラクタ
-
DOMEntityReference->__construct() - 新しい DOMEntityReference オブジェクトを作成する
DOMException
しかるべき状況、すなわち論理的に不可能な操作を行った際などの場合に DOM 操作は例外を発生させます。
例外(exceptions) も参照ください。
プロパティ
| 名前 | 型 | 読み込み専用 | 説明 |
|---|---|---|---|
| code | int | yes | 発生したエラーの型を示す整数値 |
DOMImplementation
DOMImplementation インターフェースは、個々の ドキュメントオブジェクトモデルのインスタンス独自の操作を行うための メソッド群を提供します。
コンストラクタ
-
DOMImplementation->__construct() - 新しい DOMImplementation オブジェクトを作成する
メソッド
-
DOMImplementation->createDocument() - 指定した型とドキュメント要素の DOMDocument オブジェクトを作成する
-
DOMImplementation->createDocumentType() - 空の DOMDocumentType オブジェクトを作成する
-
DOMImplementation->hasFeature() - DOM 実装が、特定の機能を実装しているかどうかを調べる
DOMNamedNodeMap
メソッド
-
DOMNamedNodeMap->getNamedItem() - 名前からノードを取得する
-
DOMNamedNodeMap->getNamedItemNS() - ローカル名と名前空間 URI からノードを取得する
-
DOMNamedNodeMap->item() - インデックスからノードを取得する
DOMNode
メソッド
-
DOMNode->appendChild() - 子要素群の最後に新しい子要素を追加する
-
DOMNode->cloneNode() - ノードを複製する
-
DOMNode->hasAttributes() - ノードが属性を保持しているかどうかを確かめる
-
DOMNode->hasChildNodes() - ノードが子を保持しているかどうかを調べる
-
DOMNode->insertBefore() - 参照しているノードの前に 新しい子を追加する
-
DOMNode->isDefaultNamespace() - 指定した名前空間 URI がデフォルトの名前空間かどうかを調べる
-
DOMNode->isSameNode() - 2 つのノードが等しいかどうかを調べる
-
DOMNode->isSupported() - 指定したバージョンで機能がサポートされているかどうかを調べる
-
DOMNode->lookupNamespaceURI() - プレフィックスに基づいて、ノードの名前空間 URI を返す
-
DOMNode->lookupPrefix() - 名前空間 URI に基づいて、ノードの名前空間プレフィックスを返す
-
DOMNode->normalize() - ノードを正規化する
-
DOMNode->removeChild() - 子要素群から子を削除する
-
DOMNode->replaceChild() - 子を置き換える
プロパティ
| 名前 | 型 | 読み込み専用 | 説明 |
|---|---|---|---|
| nodeName | string | yes | 現在のノード型の正確な名前を返す |
| nodeValue | string | no | その型に応じてノードの値を返す |
| nodeType | int | yes | ノードの型を、定義済みの定数 XML_xxx_NODE のいずれかで返す |
| parentNode | DOMNode | yes | このノードの親を返す |
| childNodes | DOMNodeList | yes | このノードのすべての子を含む DOMNodeList。 子が存在しない場合は、空の DOMNodeList |
| firstChild | DOMNode | yes | このノードの最初の子。存在しない場合は NULL を返す |
| lastChild | DOMNode | yes | このノードの最後の子。存在しない場合は NULL を返す |
| previousSibling | DOMNode | yes | このノードの直前のノード。存在しない場合は NULL を返す |
| nextSibling | DOMNode | yes | このノードの直後のノード。存在しない場合は NULL を返す |
| attributes | DOMNamedNodeMap | yes | このノードが DOMElement の場合は ノードの属性を含む DOMNamedNodeMap、 それ以外の場合は NULL |
| ownerDocument | DOMDocument | yes | このノードに関連付けられている DOMDocument オブジェクト |
| namespaceURI | string | yes | このノードの名前空間 URI。指定されていない場合は NULL |
| prefix | string | no | このノードの名前空間プレフィックス。指定されていない場合は NULL |
| localName | string | yes | このノードの名前のローカル部分を返す |
| baseURI | string | yes | このノードの完全なベース URI。もし実装が完全な URL を できなかった場合は NULL |
| textContent | string | no | このノードとその子孫ノードのテキストを返す |
DOMNodeList
メソッド
-
DOMNodelist->item() - インデックスで指定したノードを取得する
プロパティ
| 名前 | 型 | 読み込み専用 | 説明 |
|---|---|---|---|
| length | int | yes | リスト内のノードの数。有効な子ノードのインデックスの範囲は 0 以上 length - 1 以下 |
DOMNotation
DOMNode を継承します。
プロパティ
| 名前 | 型 | 読み込み専用 | 説明 |
|---|---|---|---|
| publicId | string | yes | |
| systemId | string | yes |
DOMProcessingInstruction
DOMNode を継承します。
コンストラクタ
-
DOMProcessingInstruction->__construct() - 新しい DOMProcessingInstruction オブジェクトを作成する
プロパティ
| 名前 | 型 | 読み込み専用 | 説明 |
|---|---|---|---|
| target | string | yes | |
| data | string | no |
DOMText
DOMCharacterData を継承します。
コンストラクタ
-
DOMText->__construct() - 新しい DOMText オブジェクトを作成する
メソッド
-
DOMText->isWhitespaceInElementContent() - このテキストノードが空白を含むかどうかを示す
-
DOMText->splitText() - 指定したオフセットでノードを 2 つに分割する
プロパティ
| 名前 | 型 | 読み込み専用 | 説明 |
|---|---|---|---|
| wholeText | string | yes |
DOMXPath
コンストラクタ
-
DOMXPath->__construct() - 新しい DOMXPath オブジェクトを作成する
メソッド
-
DOMXPath->registerNamespace() - DOMXpath オブジェクトの名前空間を登録する
-
DOMXPath->evaluate() - XPath 式を評価し、結果を返す
-
DOMXPath->query() - XPath 式を評価する
プロパティ
| 名前 | 型 | 読み込み専用 | 説明 |
|---|---|---|---|
| document | DOMDocument |
例
このリファレンスの多くの例では XML ファイルを使用します。その際には、 以下のような形式の book.xml を使用します。
Example#1 book.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
]>
<book id="listing">
<title>My lists</title>
<chapter id="books">
<title>My books</title>
<para>
<informaltable>
<tgroup cols="4">
<thead>
<row>
<entry>Title</entry>
<entry>Author</entry>
<entry>Language</entry>
<entry>ISBN</entry>
</row>
</thead>
<tbody>
<row>
<entry>The Grapes of Wrath</entry>
<entry>John Steinbeck</entry>
<entry>en</entry>
<entry>0140186409</entry>
</row>
<row>
<entry>The Pearl</entry>
<entry>John Steinbeck</entry>
<entry>en</entry>
<entry>014017737X</entry>
</row>
<row>
<entry>Samarcande</entry>
<entry>Amine Maalouf</entry>
<entry>fr</entry>
<entry>2253051209</entry>
</row>
<!-- TODO: I have a lot of remaining books to add.. -->
</tbody>
</tgroup>
</informaltable>
</para>
</chapter>
</book>
定義済み定数
以下の定数が定義されています。 この関数の拡張モジュールが PHP 組み込みでコンパイルされているか、 実行時に動的にロードされている場合のみ使用可能です。
| 定数 | 値 | 説明 |
|---|---|---|
| XML_ELEMENT_NODE (integer) | 1 | ノードは DOMElement です。 |
| XML_ATTRIBUTE_NODE (integer) | 2 | ノードは DOMAttr です。 |
| XML_TEXT_NODE (integer) | 3 | ノードは DOMText です。 |
| XML_CDATA_SECTION_NODE (integer) | 4 | ノードは DOMCharacterData です。 |
| XML_ENTITY_REF_NODE (integer) | 5 | ノードは DOMEntityReference です。 |
| XML_ENTITY_NODE (integer) | 6 | ノードは DOMEntity です。 |
| XML_PI_NODE (integer) | 7 | ノードは DOMProcessingInstruction です。 |
| XML_COMMENT_NODE (integer) | 8 | ノードは DOMComment です。 |
| XML_DOCUMENT_NODE (integer) | 9 | ノードは DOMDocument です。 |
| XML_DOCUMENT_TYPE_NODE (integer) | 10 | ノードは DOMDocumentType です。 |
| XML_DOCUMENT_FRAG_NODE (integer) | 11 | ノードは DOMDocumentFragment です。 |
| XML_NOTATION_NODE (integer) | 12 | ノードは DOMNotation です。 |
| XML_HTML_DOCUMENT_NODE (integer) | 13 | |
| XML_DTD_NODE (integer) | 14 | |
| XML_ELEMENT_DECL_NODE (integer) | 15 | |
| XML_ATTRIBUTE_DECL_NODE (integer) | 16 | |
| XML_ENTITY_DECL_NODE (integer) | 17 | |
| XML_NAMESPACE_DECL_NODE (integer) | 18 | |
| XML_ATTRIBUTE_CDATA (integer) | 1 | |
| XML_ATTRIBUTE_ID (integer) | 2 | |
| XML_ATTRIBUTE_IDREF (integer) | 3 | |
| XML_ATTRIBUTE_IDREFS (integer) | 4 | |
| XML_ATTRIBUTE_ENTITY (integer) | 5 | |
| XML_ATTRIBUTE_NMTOKEN (integer) | 7 | |
| XML_ATTRIBUTE_NMTOKENS (integer) | 8 | |
| XML_ATTRIBUTE_ENUMERATION (integer) | 9 | |
| XML_ATTRIBUTE_NOTATION (integer) | 10 |
| 定数 | 値 | 説明 |
|---|---|---|
| DOM_INDEX_SIZE_ERR (integer) | 1 | インデックスあるいはサイズが負です。または上限を超えています。 |
| DOMSTRING_SIZE_ERR (integer) | 2 | 指定したテキストは DOMString 内に収まりません。 |
| DOM_HIERARCHY_REQUEST_ERR (integer) | 3 | そのノードが所属できない場所に挿入されました。 |
| DOM_WRONG_DOCUMENT_ERR (integer) | 4 | ノードが、もともと作成されたのと別のドキュメントで使用されました。 |
| DOM_INVALID_CHARACTER_ERR (integer) | 5 | 名前などで、不正な文字が指定されました。 |
| DOM_NO_DATA_ALLOWED_ERR (integer) | 6 | データをサポートしていないノードでデータが指定されました。 |
| DOM_NO_MODIFICATION_ALLOWED_ERR (integer) | 7 | 変更が許可されていないオブジェクトを変更しようとしました。 |
| DOM_NOT_FOUND_ERR (integer) | 8 | 存在しないノードを参照しようとしました。 |
| DOM_NOT_SUPPORTED_ERR (integer) | 9 | 指定した型のオブジェクトや操作は、この実装ではサポートしていません。 |
| DOM_INUSE_ATTRIBUTE_ERR (integer) | 10 | 別の場所で使用中の属性を追加しようとしました。 |
| DOM_INVALID_STATE_ERR (integer) | 11 | 現在使用できない、あるいは使用できなくなったオブジェクトを 使用しようとしました。 |
| DOM_SYNTAX_ERR (integer) | 12 | 不正な文字列が指定されました。 |
| DOM_INVALID_MODIFICATION_ERR (integer) | 13 | 基底オブジェクトの型を変更しようとしました。 |
| DOM_NAMESPACE_ERR (integer) | 14 | 名前空間に存在しないオブジェクトを作成または変更しようとしました。 |
| DOM_INVALID_ACCESS_ERR (integer) | 15 | パラメータや操作は基底オブジェクトではサポートされていません。 |
| DOM_VALIDATION_ERR (integer) | 16 | insertBefore や removeChild のようなメソッドのコールによってノードの 「部分的な妥当性」が満たされなくなった際にこの例外が発生し、操作は 行われません。 |
目次
- DOMAttr->__construct() — 新しい DOMAttr オブジェクトを作成する
- DOMAttr->isId() — 属性が定義済みの ID かどうかを調べる
- DOMCharacterData->appendData() — ノードの文字データの最後に文字列を追加する
- DOMCharacterData->deleteData() — 指定した範囲の文字列をノードから削除する
- DOMCharacterData->insertData() — 指定した 16 ビット単位のオフセットに、文字列を挿入する
- DOMCharacterData->replaceData() — DOMCharacterData ノードの文字列の一部を置換する
- DOMCharacterData->substringData() — ノードから指定した範囲のデータを抽出する
- DOMComment->__construct() — 新しい DOMComment オブジェクトを作成する
- DOMDocument->__construct() — 新しい DOMDocument オブジェクトを作成する
- DOMDocument->createAttribute() — 新しい属性を作成する
- DOMDocument->createAttributeNS() — 関連付けられた名前空間に新しい属性を作成する
- DOMDocument->createCDATASection() — 新しい cdata ノードを作成する
- DOMDocument->createComment() — 新しい comment ノードを作成する
- DOMDocument->createDocumentFragment() — 新しい文書片を作成する
- DOMDocument->createElement() — 新しい要素ノードを作成する
- DOMDocument->createElementNS() — 関連付けられた名前空間に新しい要素を作成する
- DOMDocument->createEntityReference() — 新しいエンティティ参照ノードを作成する
- DOMDocument->createProcessingInstruction() — 新しい PI ノードを作成する
- DOMDocument->createTextNode() — 新しいテキストノードを作成する
- DOMDocument->getElementById() — id に対応する要素を検索する
- DOMDocument->getElementsByTagName() — 指定したタグ名に対応するすべての要素を検索する
- DOMDocument->getElementsByTagNameNS() — 指定した名前空間で、タグ名に対応するすべての要素を検索する
- DOMDocument->importNode() — 現在のドキュメントにノードをインポートする
- DOMDocument->load() — ファイルから XML を読み込む
- DOMDocument->loadHTML() — 文字列から HTML を読み込む
- DOMDocument->loadHTMLFile() — ファイルから HTML を読み込む
- DOMDocument->loadXML() — 文字列から XML を読み込む
- DOMDocument->normalizeDocument() — ドキュメントを正規化する
- DOMDocument->registerNodeClass() — 基底ノード型を作成する際に使用する拡張クラスを登録する
- DOMDocument->relaxNGValidate() — ドキュメントを relaxNG で検証する
- DOMDocument->relaxNGValidateSource() — ドキュメントを relaxNG で検証する
- DOMDocument->save() — 内部の XML ツリーをファイルに出力する
- DOMDocument->saveHTML() — 内部のドキュメントを HTML 形式の文字列として出力する
- DOMDocument->saveHTMLFile() — 内部のドキュメントを HTML 形式でファイルに出力する
- DOMDocument->saveXML() — 内部の XML ツリーを文字列として出力する
- DOMDocument->schemaValidate() — スキーマに基づいてドキュメントを検証する
- DOMDocument->schemaValidateSource() — スキーマに基づいてドキュメントを検証する
- DOMDocument->validate() — DTD に基づいてドキュメントを検証する
- DOMDocument->xinclude() — DOMDocument オブジェクト内の XIncludes を置換する
- DOMDocumentFragment->appendXML() — 生の XML データを追加する
- DOMElement->__construct() — 新しい DOMElement オブジェクトを作成する
- DOMElement->getAttribute() — 属性の値を返す
- DOMElement->getAttributeNode() — 属性ノードを返す
- DOMElement->getAttributeNodeNS() — 属性ノードを返す
- DOMElement->getAttributeNS() — 属性の値を返す
- DOMElement->getElementsByTagName() — タグ名から要素を取得する
- DOMElement->getElementsByTagNameNS() — 名前空間 URI とローカル名から要素を取得する
- DOMElement->hasAttribute() — 属性が存在するかどうかを調べる
- DOMElement->hasAttributeNS() — 属性が存在するかどうかを調べる
- DOMElement->removeAttribute() — 属性を削除する
- DOMElement->removeAttributeNode() — 属性を削除する
- DOMElement->removeAttributeNS() — 属性を削除する
- DOMElement->setAttribute() — 新しい属性を追加する
- DOMElement->setAttributeNode() — 新しい属性ノードを要素に追加する
- DOMElement->setAttributeNodeNS() — 新しい属性ノードを要素に追加する
- DOMElement->setAttributeNS() — 新しい属性を追加する
- DOMElement->setIdAttribute() — ID 型の属性を名前で宣言する
- DOMElement->setIdAttributeNode() — ID 型の属性をノードで宣言する
- DOMElement->setIdAttributeNS() — ID 型の属性をローカル名および名前空間 URI で宣言する
- DOMEntityReference->__construct() — 新しい DOMEntityReference オブジェクトを作成する
- DOMImplementation->__construct() — 新しい DOMImplementation オブジェクトを作成する
- DOMImplementation->createDocument() — 指定した型とドキュメント要素の DOMDocument オブジェクトを作成する
- DOMImplementation->createDocumentType() — 空の DOMDocumentType オブジェクトを作成する
- DOMImplementation->hasFeature() — DOM implementation が、指定した機能を実装しているかどうかを調べる
- DOMNamedNodeMap->getNamedItem() — 名前で指定されたノードを取得する
- DOMNamedNodeMap->getNamedItemNS() — ローカル名および名前空間 URI で指定したノードを取得する
- DOMNamedNodeMap->item() — インデックスで指定したノードを取得する
- DOMNode->appendChild() — 子要素群の最後に新しい子要素を追加する
- DOMNode->cloneNode() — ノードを複製する
- DOMNode->hasAttributes() — ノードが属性を保持しているかどうかを調べる
- DOMNode->hasChildNodes() — ノードが子を保持しているかどうかを調べる
- DOMNode->insertBefore() — 参照しているノードの前に新しい子を追加する
- DOMNode->isDefaultNamespace() — 指定した namespaceURI がデフォルトの名前空間かどうかを調べる
- DOMNode->isSameNode() — 2 つのノードが等しいかどうかを調べる
- DOMNode->isSupported() — 指定したバージョンで機能がサポートされているかどうかを調べる
- DOMNode->lookupNamespaceURI() — プレフィックスに基づいて、ノードの名前空間 URI を取得する
- DOMNode->lookupPrefix() — 名前空間 URI に基づいて、ノードの名前空間プレフィックスを取得する
- DOMNode->normalize() — ノードを正規化する
- DOMNode->removeChild() — 子要素群から子要素を削除する
- DOMNode->replaceChild() — 子を置き換える
- DOMNodelist->item() — インデックスで指定したノードを取得する
- DOMProcessingInstruction->__construct() — 新しい DOMProcessingInstruction オブジェクトを作成する
- DOMText->__construct() — 新しい DOMText オブジェクトを作成する
- DOMText->isWhitespaceInElementContent() — このテキストノードが空白を含むかどうかを示す
- DOMText->splitText() — 指定したオフセットでノードを 2 つに分割する
- DOMXPath->__construct() — 新しい DOMXPath オブジェクトを作成する
- DOMXPath->evaluate() — 与えられた XPath 式を評価し、可能であれば結果を返す
- DOMXPath->query() — 与えられた XPath 式を評価する
- DOMXPath->registerNamespace() — DOMXPath オブジェクトの名前空間を登録する
- dom_import_simplexml — SimpleXMLElement オブジェクトから DOMElement オブジェクトを取得する
DOM
09-Jan-2008 03:15
04-Jan-2008 10:06
The following can take a XML_TEXT_NODE node and return the contents in an array. Yanick's contribution rocks - but
it overwrote with duplicates only keeping the last line
in the returned array. All the other functions i tested from various sources failed to handle text nodes correctly. Hope this helps someone. It is adapted from code on this site.
function myTextNode($n, &$a)
{
static $depth = 0;
static $sz = '';
if ($cn = $n->firstChild)
{
while ($cn)
{
if ($cn->nodeType == XML_TEXT_NODE)
{
$sz .= $cn->nodeValue;
}
elseif ($cn->nodeType == XML_ELEMENT_NODE)
{
$b = 1;
if ($cn->hasChildNodes())
{
$depth++;
if ($this->myHeadings($cn, $a))
{
if ($sz){
array_push($a, $sz);
$sz = '';
}
}
$depth--;
}
}
$cn = $cn->nextSibling;
}
return $b;
}
}
so you could use:
$nodes = $dom->getElementsByTagName("td");
if($nodes){
foreach ($nodes as $node){
$a = Array();
myTextNode($node, $a);
}
}
13-Nov-2007 11:56
In response to TrollBoy:
You might want to look a little harder before you go and write new code, someone posted a function that does exactly what your class does about a week before you. Also their function allows you to seed the document with a root so it could technically work for HTML documents as well.
13-Nov-2007 08:12
I wrote a simple class to turn an associative array into xml, as this seems like something fairly simple, but nothing out there does it that I know of. That said, enjoy.
<?php
/**
* basic class for converting an array to xml.
* @author Matt Wiseman (trollboy at shoggoth.net)
*
*/
class array2xml {
public $data;
public $dom_tree;
/**
* basic constructor
*
* @param array $array
*/
public function __construct($array){
if(!is_array($array)){
throw new Exception('array2xml requires an array', 1);
unset($this);
}
if(!count($array)){
throw new Exception('array is empty', 2);
unset($this);
}
$this->data = new DOMDocument('1.0');
$this->dom_tree = $this->data->createElement('result');
$this->data->appendChild($this->dom_tree);
$this->recurse_node($array, $this->dom_tree);
}
/**
* recurse a nested array and return dom back
*
* @param array $data
* @param dom element $obj
*/
private function recurse_node($data, $obj){
$i = 0;
foreach($data as $key=>$value){
if(is_array($value)){
//recurse if neccisary
$sub_obj[$i] = $this->data->createElement($key);
$obj->appendChild($sub_obj[$i]);
$this->recurse_node($value, $sub_obj[$i]);
} elseif(is_object($value)) {
//no object support so just say what it is
$sub_obj[$i] = $this->data->createElement($key, 'Object: "' . $key . '" type: "' . get_class($value) . '"');
$obj->appendChild($sub_obj[$i]);
} else {
//straight up data, no weirdness
$sub_obj[$i] = $this->data->createElement($key, $value);
$obj->appendChild($sub_obj[$i]);
}
$i++;
}
}
/**
* get the finished xml
*
* @return string
*/
public function saveXML(){
return $this->data->saveXML();
}
}
$test = array(
'cat'=>'animal',
'container'=> array(
'thing'=>'stuff',
'thing2'=>'stuff2',
'thing3'=>3,
'thing4'=>4,
'wtf'=> new stdClass(),
),
'foo'=>'bar',
);
var_dump($test);
try {
$o_test = new array2xml($test);
} catch (Exception $e) {
echo $e->getMessage();
}
echo $o_test->saveXML();
?>
04-Nov-2007 12:42
Array to DOM
Here is a recursive function to turn a multidimensional array into an XML document. It will handle multiple elements of the same tag, but only one per parent element. IE:
Can't generate: Can generate:
<root> <root>
<sub1>data1</sub1> <subs1>
<sub1>data2</sub1> <value>data1</value>
<sub2>data1</sub2> <value>data2</value>
<sub2>data2</sub2> </subs1>
</root> <subs2>
<value>data1</value>
<value>data2</value>
<subs2>
</root>
Also, the function performs no type of error checking on your array and will throw a DOMException if a key value you used in your array contains invalid characters for a proper DOM tag. This function is untested for "deep" multidimensional arrays.
Complete code ready to run with example:
<?PHP
function AtoX($array, $DOM=null, $root=null){
if($DOM == null){$DOM = new DOMDocument('1.0', 'iso-8859-1');}
if($root == null){$root = $DOM->appendChild($DOM->createElement('root'));}
$name = $array['#MULTIPLE_ELEMENT_NAME'];
foreach($array as $key => $value){
if(is_int($key) && $name != null){
if(is_array($value)){
$subroot = $root->appendChild($DOM->createElement($name));
AtoX($value, $DOM, $subroot);
}
else if(is_scalar($value)){
$root->appendChild($DOM->createElement($name, $value));
}
}
else if(is_string($key) && $key != '#MULTIPLE_ELEMENT_NAME'){
if(is_array($value)){
$subroot = $root->appendChild($DOM->createElement($key));
AtoX($value, $DOM, $subroot);
}
else if(is_scalar($value)){
$root->appendChild($DOM->createElement($key, $value));
}
}
}
return $DOM;
}
$array = array(
'#MULTIPLE_ELEMENT_NAME' => 'GenericDatas',
'Date' => 'November 03, 2007',
'Company' => 'Facility One',
'Field' => 'Facility Management Software',
'Employees' => array(
'#MULTIPLE_ELEMENT_NAME' => 'Employee',
'Cindy',
'Sean',
'Joe',
'Owen',
'Jim',
'Dale',
'Kelly',
'Ryan',
'Johnathan',
'Robin',
'William Marcus',
'NewCoops' => array(
'#MULTIPLE_ELEMENT_NAME' => 'Coop',
'John',
'Tyler',
'Ray',
'Dawn'
)
),
'Datas',
'DATAS',
'OtherDatas'
);
$DOM = new DOMDocument('1.0', 'iso-8859-1');
$root = $DOM->appendChild($DOM->createElement('CompanyData'));
$DOM = AtoX($array, $DOM, $root);
$DOM->save('C:\test.xml');
?>
03-Nov-2007 03:02
In order to REALLY well handle XHTML entities with DOM, you can do following things:
1. Add this DOCTYPE to your documents
<!DOCTYPE xhtmlentities PUBLIC "-//W3C//ENTITIES XHTML Character Entities 1.0//EN" "/xhtml11.ent">
2. Copy http://freyjkell.ovh.org/xhtml11.ent into your document root.
3. In your PHP:
<?php
$dom=new DOMDocument();
$dom->load('file.xhtml',LIBXML_DTDLOAD); // NOT resolveExternals - it needs true doctype, and includes crap code
// some DOM operations
$doctype=DOMImplementation::createDocumentType("html","-//W3C//DTD XHTML 1.1//EN","http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"); // creating real doctype
$output=DOMImplementation::createDocument('','',$doctype);
$output->appendChild($output->importNode($dom->documentElement,true));
$output->encoding='utf-8';
$output=$output->saveXML();
$xhtml=preg_match(
'/application\/xhtml\+xml(?![+a-z])'.
'(;q=(0\.\d{1,3}|[01]))?/i',
$_SERVER['HTTP_ACCEPT'],$xhtml) &&
(isset($xhtml[2])?$xhtml[2]:1) > 0 ||
strpos($_SERVER["HTTP_USER_AGENT"],
"W3C_Validator")!==false ||
strpos($_SERVER["HTTP_USER_AGENT"],
"WebKit")!==false; // XHTML Content-Negotiation
header('Content-Type: '.($xhtml?'application/xhtml+xml':'text/html').'; charset=utf-8');
print $output;
?>
06-Sep-2007 06:46
The Yanik's dom2array() function (added on 14-Mar-2007 08:40) does not handle multiple nodes with the same name, i.e.:
<foo>
<name>aa</name>
<name>bb</name>
</foo>
It will overwrite former and your array will contain just the last one ("bb")
02-Aug-2007 03:21
In response to lutfi at smartconsultant dot us :
(see my post on
http://fr2.php.net/manual/en/
function.dom-domdocument-getelementsbytagname.php
)
Use this class I wrote:
class XPathableNode extends DOMNode
{
protected $Node;
protected $DOMDocument_from_node;
protected $DOMXpath_for_node;
public function __construct(/* DOMNode */ $node)
{
$this->Node=$node;
$this->DOMDocument_from_node=new
DomDocument();
$domNode=$this->DOMDocument_from_node
->importNode($this->Node, true);
$this->DOMDocument_from_node
->appendChild($domNode);
$this->DomXpath_for_node =
new Domxpath($this->
DOMDocument_from_node);
}
public function convertHTML()
{ return $this->DOMDocument_from_node
->saveHTML();
}
public /*DomNodeList*/ function applyXpath($xpath)
{ return $this->DomXpath_for_node
->query($xpath);
}
}
(sorry for the display... What a terrible hinderance on the
part of php.net !)
Then :
Make a new XPathableNode out of your parent node.
You may then retrieve a DOMNodeList from it by applying a
xpath (thus being able to specify the depth and name of
elements you want).
Has got me around some (of the many) DOM awkwardnesses a few times.
;o)
21-Jul-2007 09:41
Basicly there are alot of problems on dynamic namespaces registering and other maybe 'not well' documented parts of DOM.
Here is an article covering some of the problems that our company web developers found while we were developing a template engine for our new framework.
The link:
http://blog.axisvista.com/?p=35
20-Jul-2007 01:06
i have some problem parsing recurred xml tree here:
<menu name='parent1' >
<submenu name='file' >
<submenu name='open' >Open file</submenu>
<submenu name='close' >Close file</submenu>
</submenu>
<submenu name='edit' >
<submenu name='cut' >Cut Clipboards</submenu>
<submenu name='copy' >Copy Clipboards</submenu>
<submenu name='paste' >Paste Clipboards</submenu>
</submenu>
</menu>
with getElementsByTagName all submenu is on the same level.
i want it to be structured like tree list, but not change the 'submenu' tag
05-Jun-2007 06:45
appended to
brian dot reynolds at risaris dot com
20-Feb-2007 10:09
when you got variable nodes at start you array fails and looses nodes beneath.
solution that counts occurance though eats up performance:
function xmlToArray($n)
{
$xml_array = array();
$occurance = array();
foreach($n->childNodes as $nc)
{
$occurance[$nc->nodeName]++;
}
foreach($n->childNodes as $nc){
if( $nc->hasChildNodes() )
{
if($occurance[$nc->nodeName] > 1)
{
$xml_array[$nc->nodeName][] = xmlToArray($nc);
}
else
{
$xml_array[$nc->nodeName] = xmlToArray($nc);
}
}
else
{
return utf8_decode($nc->nodeValue);
}
}
return $xml_array;
}
14-Mar-2007 04:40
I hate DOM model !
so I wrote dom2array simple function (simple for use):
function dom2array($node) {
$res = array();
print $node->nodeType.'<br/>';
if($node->nodeType == XML_TEXT_NODE){
$res = $node->nodeValue;
}
else{
if($node->hasAttributes()){
$attributes = $node->attributes;
if(!is_null($attributes)){
$res['@attributes'] = array();
foreach ($attributes as $index=>$attr) {
$res['@attributes'][$attr->name] = $attr->value;
}
}
}
if($node->hasChildNodes()){
$children = $node->childNodes;
for($i=0;$i<$children->length;$i++){
$child = $children->item($i);
$res[$child->nodeName] = dom2array($child);
}
}
}
return $res;
}
11-Mar-2007 12:35
I wrote a couple of functions to:
- create a DOMDocument from a file
- parse the namespaces in it
- create a XPath object with all the namespaces registered
- load the schemalocations
- validate the file on the main schema (the one without prefix)
It is useful for me, see if it is also for someone else!!
Giulio
function decodeNode($node)
{
$out = $node->ownerDocument->saveXML($node);
$re = "{^<((?:\\w*:)?\\w*)". //the tag name
"[\\s\n\r]*((?:[\\s\n\r]*".
"(?:\\w*:)?\\w+[\\s\n\r]*=[\\s\n\r]*". //possible attribute name
"(?:\"[^\"]*\"|\'[^\']*\'))*)". //attribute value
"[\\s\n\r]*>[\r\n]*".
"((?:.*[\r\n]*)*)". //content
"[\r\n]*</\\1>$}"; //closing tag
preg_match($re, $out, $mat);
return $mat;
}
function innerXml($node)
{
$mat = decodeNode($node);
return $mat[3];
}
function getnodeAttributes($node)
{
$mat = decodeNode($node);
$txt = $mat[2];
$re = "{((?:\\w*:)?\\w+)[\\s\n\r]*=[\\s\n\r]*(\"[^\"]*\"|\'[^\']*\')}";
preg_match_all($re, $txt, $mat);
$att = array();
for ($i=0; $i<count($mat[0]); $i++)
{
$value = $mat[2][$i];
if ($value[0] == "\'" || $value[0] == "\"")
{
$len = strlen($value);
$value = substr($value, 1, strlen($value)-2);
}
$att[ $mat[1][$i] ] = $value;
}
return $att;
}
function loadXml($file)
{
$doc = new DOMDocument();
$doc->load($file);
//cerca l'attributo xmlns
$xsi = false;
$doc->namespaces = array();
$doc->xpath = new DOMXPath($doc);
$attr = getnodeAttributes($doc->documentElement);
foreach ($attr as $name => $value)
{
if (substr($name,0,5) == "xmlns")
{
$uri = $value;
$pre = $doc->documentElement->lookupPrefix($uri);
if ($uri == "http://www.w3.org/2001/XMLSchema-instance")
$xsi = $pre;
$doc->namespaces[$pre] = $uri;
if ($pre == "")
$pre = "noname";
$doc->xpath->registerNamespace($pre, $uri);
}
}
if ($xsi)
{
$doc->schemaLocations = array();
$lst = $doc->xpath->query("//@$xsi:schemaLocation");
foreach($lst as $el)
{
$re = "{[\\s\n\r]*([^\\s\n\r]+)[\\s\n\r]*([^\\s\n\r]+)}";
preg_match_all($re, $el->nodeValue, $mat);
for ($i=0; $i<count($mat[0]); $i++)
{
$value = $mat[2][$i];
$doc->schemaLocations[ $mat[1][$i] ] = $value;
}
}
$olddir = getcwd();
chdir(dirname($file));
$schema = $doc->schemaLocations[$doc->namespaces[""]];
if (substr($schema,0,7) == "file://")
{
$schema = substr($value,7);
}
if (!$doc->schemaValidate($schema))
dbg()->err("Invalid file");
chdir($olddir);
}
return $doc;
}
20-Feb-2007 06:09
I found the xml2array function below very useful, but there seems to be a bug in it. The $item variable was never getting set. I've expanded this out to be a bit more readable, and the corrected code is :
function xmlToArray($n)
{
$return=array();
foreach($n->childNodes as $nc){
if( $nc->hasChildNodes() ){
if( $n->firstChild->nodeName== $n->lastChild->nodeName&&$n->childNodes->length>1){
$item = $n->firstChild;
$return[$nc->nodeName][]=$this->xmlToArray($item);
}
else{
$return[$nc->nodeName]=$this->xmlToArray($nc);
}
}
else{
$return=$nc->nodeValue;
}
}
return $return;
}
22-Nov-2006 07:32
If you are using not object-oriented functions and it takes too much time to change them all (or you'll be replacing them later) then as a temporary decision can be used this modules:
For DOM XML:
http://alexandre.alapetite.net/doc-alex/domxml-php4-php5/
For XSLT:
http://alexandre.alapetite.net/doc-alex/xslt-php4-php5/
17-Oct-2006 07:48
Most email clients ignore stylesheets in HTML formatted emails. The best way to ensure your HTML is formatted correctly by a broad spectrum of email clients, including webmail implementations as Gmail, is to use inline style attributes. The following function uses DOM to parse an inline stylesheet, and will replace element class and id attributes with inline style attributes, and add inline style attributes for generic tag stylesheet rules. It will remove the stylesheet and any used class and id attributes as these are defunct for most email clients. It is a fairly lightweight function and does not support CSS inheritance, but will work for simple stylesheets e.g.:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>HTML EMAIL</title>
<style type="text/css">
body {
margin: 10px 10px;
font: 8pt arial;
background: #fff;
color: #000;
}
p {
margin: 0 0 10px;
line-height: 1.2em;
text-align: justify;
}
p.centered {
text-align: centre;
}
p#right {
text-align: right;
}
</style>
</head>
<body>
<p>Sample text justified</p>
<p class="centered">Centered text here</p>
<p id="right">Right-aligned text</p>
</body>
</html>
Here's the function:
<?php
function parseStyleSheetfor Email($html)
{
$doc = new DOMDocument;
$doc->loadHTML($html);
// grab inline stylesheet as DOM object
$oStyle = $doc->getElementsByTagName('style')->item(0);
// grab rule identifiers and rules
preg_match_all('/^([-#._a-z0-9]+) ?\{(.*?)\}/ims', $oStyle->nodeValue, $aMatches, PREG_SET_ORDER);
foreach ($aMatches as $aRule) {
$rule_id = $aRule[1];
// clean up rules
$rule = str_replace(array("\r", "\n", ' ', '; '), array('', '', ' ', ';'), $aRule[2]);
$rule = preg_replace(array('/^ /', '/;$/'), '', $rule);
// generic rules
if (!strstr($rule_id, '.') && !strstr($rule_id, '#')) {
$items = $doc->getElementsByTagName($rule_id);
// set style attribute equal to rule from stylesheet
foreach ($items as $item) {
// if there is already inline style append it to end of stylesheet rule
$current_style = $item->getAttribute('style');
if (!empty($current_style)) {
$item->setAttribute('style', $rule . ';' . $current_style);
} else {
$item->setAttribute('style', $rule);
}
}
// classes
} elseif (strstr($rule_id, '.')) {
list($rule_tag, $rule_class) = explode('.', $rule_id);
$items = $doc->getElementsByTagName($rule_tag);
foreach ($items as $item) {
$class = $item->getAttribute('class');
if ($class == $rule_class) {
// if there is already inline style append it to end of stylesheet rule
$current_style = $item->getAttribute('style');
if (!empty($current_style)) {
$item->setAttribute('style', $current_style . ';' . $rule);
} else {
$item->setAttribute('style', $rule);
}
// remove class as it won't be used now
$item->removeAttribute('class');
}
}
// ids
} elseif (strstr($rule_id, '#')) {
list($rule_tag, $id) = explode('#', $rule_id);
$item = $doc->getElementById($id);
$current_style = $item->getAttribute('style');
if (!empty($current_style)) {
$item->setAttribute('style', $current_style . ';' . $rule);
} else {
$item->setAttribute('style', $rule);
}
// remove class as it won't be used now
$item->removeAttribute('id');
}
}
// remove inline stylesheet
$oStyle->parentNode->removeChild($oStyle);
return $doc->saveHTML();
}
?>
18-Aug-2006 02:21
$xmlDoc=<<<XML
<?xml version="1.0"?>
<methodCall>
<methodName>examples.getStateName</methodName>
<params>
<param>
<value><i4>41</i4></value>
</param>
</params>
</methodCall>
XML;
$xml= new DOMDocument();
$xml->preserveWhiteSpace=false;
$xml->loadXML($xmlDoc);
print_r(xml2array($xml));
function xml2array($n)
{
$return=array();
foreach($n->childNodes as $nc)
($nc->hasChildNodes())
?($n->firstChild->nodeName== $n->lastChild->nodeName&&$n->childNodes->length>1)
?$return[$nc->nodeName][]=xml2array($item)
:$return[$nc->nodeName]=xml2array($nc)
:$return=$nc->nodeValue;
return $return;
}
20-Feb-2006 07:56
If you're moving from PHP4 to PHP5, you can keep your scripts untouched using this:
http://alexandre.alapetite.net/doc-alex/domxml-php4-php5/index.en.html
29-Dec-2005 05:16
The project I'm currently working on uses XPaths to dynamically navigate through chunks of an XML file. I couldn't find any PHP code on the net that would build the XPath to a node for me, so I wrote my own function. Turns out it wasn't as hard as I thought it might be (yay recursion), though it does entail using some PHP shenanigans...
Hopefully it'll save someone else the trouble of reinventing this wheel.
<?php
function getNodeXPath( $node ) {
// REMEMBER THAT XPATHS USE BASE-1 INSTEAD OF BASE-0!!!
// Get the index for the current node by looping through the siblings.
$parentNode = $node->parentNode;
if( $parentNode != null ) {
$nodeIndex = 0;
do {
$testNode = $parentNode->childNodes->item( $nodeIndex );
$nodeName = $testNode->nodeName;
$nodeIndex++;
// PHP trickery! Here we create a counter based on the node
// name of the test node to use in the XPath.
if( !isset( $$nodeName ) ) $$nodeName = 1;
else $$nodeName++;
// Failsafe return value.
if( $nodeIndex > $parentNode->childNodes->length ) return( "/" );
} while( !$node->isSameNode( $testNode ) );
// Recursively get the XPath for the parent.
return( getNodeXPath( $parentNode ) . "/{$node->nodeName}[{$$nodeName}]" );
} else {
// Hit the root node! Note that the slash is added when
// building the XPath, so we return just an empty string.
return( "" );
}
}
?>
14-Dec-2005 11:25
Being an experienced ASP developer I was wondering how to replace textual content of a node (with msxml this is simply acheived by setting the 'text' property of a node). Out of frustration I started to play around with SimpleXml but I could not get it to work in combination with xPath.
I took me a lot of time to find out so I hope this helps others:
function replaceNodeText($objXml, $objNode, $strNewContent){
/*
This function replaces a node's string content with strNewContent
*/
$objNodeListNested = &$objNode->childNodes;
foreach ( $objNodeListNested as $objNodeNested ){
if ($objNodeNested->nodeType == XML_TEXT_NODE)$objNode->removeChild ($objNodeNested);
}
$objNode->appendChild($objXml->createTextNode($strNewContent));
}
$objXml= new DOMDocument();
$objXml->loadXML('<root><node id="1">bla</note></root>');
$objXpath = new domxpath($objXml);
$strXpath="/root/node[@id='1']";
$objNodeList = $objXpath ->query($strXpath);
foreach ($objNodeList as $objNode){
//pass the node by reference
replaceNodeText($objXml, &$objNode, $strImportedValue);
}
18-Nov-2005 07:10
Note that these DOM functions expect (and presumably return) all their data in UTF-8 character encoding, regardless of what PHP's current encoding is. This means that text nodes, attribute values etc, should be in utf8.
This applies even if you're generating an XML document which is not ultimately in utf8.
Mark
23-Oct-2005 03:08
This module is not included by default either in the CentOS 4 "centosplus" repository. For those using PHP5 on CentOS 4, a simple "yum --enablerepo=centosplus install php-xml" will do the trick (this will install both the XML and DOM modules).
29-Sep-2005 04:32
When I tried to parse my XHTML Strict files with DOM extension, it couldn't understand xhtml entities (like ©). I found post about it here (14-Jul-2005 09:05) which adviced to add resolveExternals = true, but it was very slow. There was some small note about xml catalogs but without any glue. Here it is:
XML catalogs is something like cache. Download all needed dtd's to /etc/xml, edit file /etc/xml/catalog and add this line: <public publicId="-//W3C//DTD XHTML 1.0 Strict//EN" uri="file:///etc/xml/xhtml1-strict.dtd" />
Thats all. Thanks to http://www.whump.com/moreLikeThis/link/03815
22-Aug-2005 09:09
This particular W3C page provides invaluable documentation for the DOM classes implemented in php5 (via libxml2). It fills in plenty of php.net's gaps:
http://www.w3.org/TR/DOM-Level-2-Core/core.html
Some key examples:
* concise summary of the class heirachy (1.1.1)
* clarification that DOM level 2 doesn't allow for population of internal DTDs
* explanation of DOMNode->normalize()
* explanation of the DOMImplementation class
The interfaces are described in OMG's Interface Definition Language
19-Jul-2005 10:04
As of PHP 5.1, libxml options may be set using constants rather than the use of proprietary DomDocument properties.
DomDocument->resolveExternals is equivilant to setting
LIBXML_DTDLOAD
LIBXML_DTDATTR
DomDocument->validateOnParse is equivilant to setting
LIBXML_DTDLOAD
LIBXML_DTDVALID
PHP 5.1 users are encouraged to use the new constants.
Example:
DomDocument->load($file, LIBXML_DTDLOAD|LIBXML_DTDATTR);
DomDocument->load($file, LIBXML_DTDLOAD|LIBXML_DTDVALID);
19-Jul-2005 12:27
When dealing with validation or loading, the output errors can be quite annoying.
PHP 5.1 introduces libxml_get_errors().
http://php.net/libxml_get_errors
15-Jul-2005 04:05
[Editor's Note: If you're using entities, then you have no choice. XML Catalogs can speed DTD resolution.]
Never use
$dom->resolveExternals=true;
when parsing XHTML document that has the DOCTYPE declaration with DTD URL specified in it.
Otherwise parsing the XHTML with DOCTYPE like this one:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
will result in PHP/DOM downloading the DTD file from W3C site when parsing your document. It will add extra delay to your script - I experienced that $dom->load()'s total time was from 1 to 16 seconds.
elixon
12-Apr-2005 02:18
I wrote a framework to implement the StyleSheet interfaces as specified on the W3C website. The code is written in PHP, and is NOT a complete implementation. Use it how ya like. I was planning on adding the CSSStyleSheet interfaces as well. Feel free to ask.
<?
class StyleSheetList {
public length;
private self;
function __construct ( ) {
$this->self = array();
}
function __get($property, $&ret) {
if($property == 'length')
$ret = count($this->self);
return true;
}
function __set($property, $val) {
if($property == 'length')
return true;
}
function item( $index ) {
return $this->self[$index];
}
}
class MediaList extends StyleSheetList {
function appendMedium ( $newMedium ) {
array_push($this->self, $newMedium);
}
function deleteMedium ( $oldMedium ) {
foreach($this->self as $item) {
if( $item == $oldMedium ) {
$item = $this->self[ $this->length-1 ];
array_pop($this->self);
break;
}
}
}
}
class DocumentStyle {
public styleSheets;
function __construct ( ) {
$this->styleSheets = new StyleSheetList();
}
function __set($property, $val) {
if($property == 'styleSheets')
return true;
}
}
class LinkStyle {
public sheet;
function __construct () {
$this->sheet = new StyleSheet();
}
function __set($property, $val) {
if($property == 'sheet')
return true;
}
}
class StyleSheet {
public type;
public disabled;
public ownerNode;
public parentStyleSheet;
public href;
public title;
public media;
function __construct( $type, $disabled, $ownerNode, $parentStyleSheet, $href, $title){
$this->type = $type;
$this->disabled = $disabled;
$this->media = new MediaList();
$this->ownerNode = $ownerNode;
$this->parentStyleSheet = $parentStyleSheet;
$this->href = $href;
$this->title = $title;
}
}
?>
Only contactable via http://murpsoft.com/contact.html