ホームページ >php教程 >php手册 >PHPl は DOM XML を使用して XML を操作します [概要]

PHPl は DOM XML を使用して XML を操作します [概要]

WBOY
WBOYオリジナル
2016-06-21 08:48:37981ブラウズ

1. はじめに

XML は明確なツリー状の階層構造を持ち、設定ファイルとして非常に適しています。 DOM XML を PHP で使用して XML を操作できます。この記事では、PHP が DOM XML を使用して XML ファイルを作成、追加し、クエリを実行する方法について概要を説明します。

2. DOM XML を使用する

XML のノードは要素とテキストに分かれています。DOMDocument 型はドキュメント型であり、要素とテキストを操作するためのメンバー関数と属性を提供します。

DOMDocument クラスは次のとおりです:

コードをコピー

DOMDocument は DOMNode を拡張します {

/* プロパティ */

読み取り専用パブリック文字列 $actualEncoding ;

readonly public DOMConfiguration $config ;

読み取り専用 public DOMDocumentType $doctype ;

readonly public DOMElement $documentElement ;

パブリック文字列 $documentURI ;

パブリック文字列 $encoding ;

パブリック ブール $formatOutput ;

readonly public DOMImplementation $implementation ;

public bool $preserveWhiteSpace =true ;

パブリックブール $recover ;

public bool $resolveExternals ;

パブリックブール $スタンドアロン ;

public bool $strictErrorChecking =true ;

パブリック ブール $substituteEntities ;

パブリックブール $validateOnParse =false ;

パブリック文字列 $version ;

読み取り専用パブリック文字列 $xmlEncoding ;

パブリック ブール $xmlStandalone ;

パブリック文字列 $xmlVersion ;

/* メソッド */

__construct ([ string $version [, string $encoding ]] )

DOMAttr createAttribute ( string $name )

DOMAttr createAttributeNS ( string $namespaceURI , string $qualifiedName )

DOMCDATASection createCDATASection ( string $data )

DOMComment createComment ( string $data )

DOMDocumentFragment createDocumentFragment (void)

DOMElement createElement ( string $name [, string $value ] )

DOMElement createElementNS ( string $namespaceURI , string $qualifiedName [, string $value ] )

DOMEntityReference createEntityReference ( string $name )

DOMProcessing命令 createProcessing命令 ( string $target [, string $data ] )

DOMText createTextNode ( string $content )

DOMElement getElementById ( string $elementId )

DOMNodeList getElementsByTagName ( string $name )

DOMNodeList getElementsByTagNameNS ( string $namespaceURI , string $localName )

DOMNode importNode ( DOMNode $importedNode [, bool $deep ] )

混合ロード ( string $filename [, int $options=0 ] )

bool loadHTML ( string $source )

bool loadHTMLFile ( string $filename )

混合ロードXML ( string $source [, int $options=0 ] )

void NormalizeDocument ( void )

bool registerNodeClass ( string $baseclass , string $extendedclass )

bool RelaxNGValidate ( string $filename )

bool RelaxNGValidateSource ( string $source )

int save ( string $filename [, int $options ] )

文字列 saveHTML (void)

int saveHTMLFile ( string $filename )

string saveXML ([ DOMNode $node [, int $options ]] )

bool schemaValidate ( string $filename )

bool schemaValidateSource ( string $source )

bool validate (void)

int xinclude ([ int $options ] )

/* 継承されたメソッド */

DOMNode DOMNode::appendChild ( DOMNode $newnode )

DOMNode DOMNode::cloneNode ([ bool $deep ] )

bool DOMNode::hasAttributes (void)

bool DOMNode::hasChildNodes (void)

DOMNode DOMNode::insertBefore ( DOMNode $newnode [, DOMNode $refnode ] )

bool DOMNode::isDefaultNamespace ( string $namespaceURI )

bool DOMNode::isSameNode ( DOMNode $node )

bool DOMNode::isSupported ( string $feature , string $version )

string DOMNode::lookupNamespaceURI ( string $prefix )

string DOMNode::lookupPrefix ( string $namespaceURI )

void DOMNode::normalize ( void )

DOMNode DOMNode::removeChild ( DOMNode $oldnode )

DOMNode DOMNode::replaceChild ( DOMNode $newnode , DOMNode $oldnode )

}

コードをコピー

要素ノード クラスの DOMElement タイプは次のように定義されます:

コードをコピー

1 DOMElement は DOMNode を拡張します {

2 /* プロパティ */

3 読み取り専用 public bool $schemaTypeInfo ;

4 読み取り専用パブリック文字列 $tagName ;

5 /* メソッド */

6 __construct ( string $name [, string $value [, string $namespaceURI ]] )

7 文字列 getAttribute ( string $name )

8 DOMAttr getAttributeNode ( string $name )

9 DOMAttr getAttributeNodeNS ( string $namespaceURI , string $localName )

10 string getAttributeNS ( string $namespaceURI , string $localName )

11 DOMNodeList getElementsByTagName ( string $name )

12 DOMNodeList getElementsByTagNameNS ( string $namespaceURI , string $localName )

13 bool hasAttribute ( string $name )

14 bool hasAttributeNS ( string $namespaceURI , string $localName )

15 bool RemoveAttribute ( string $name )

16 bool RemoveAttributeNode ( DOMAttr $oldnode )

17 bool RemoveAttributeNS ( string $namespaceURI , string $localName )

18 DOMAttr setAttribute ( string $name , string $value )

19 DOMAttr setAttributeNode ( DOMAttr $attr )

20 DOMAttr setAttributeNodeNS ( DOMAttr $attr )

21 void setAttributeNS ( string $namespaceURI , string $qualifiedName , string $value )

22 void setIdAttribute ( string $name , bool $isId )

23 void setIdAttributeNode ( DOMAttr $attr , bool $isId )

24 void setIdAttributeNS ( string $namespaceURI , string $localName , bool $isId )

25 /* 継承されたメソッド */

26 DOMNode DOMNode::appendChild ( DOMNode $newnode )

27 DOMNode DOMNode::cloneNode ([ bool $deep ] )

28 bool DOMNode::hasAttributes ( void )

29 bool DOMNode::hasChildNodes ( void )

30 DOMNode DOMNode::insertBefore ( DOMNode $newnode [, DOMNode $refnode ] )

31 bool DOMNode::isDefaultNamespace ( string $namespaceURI )

32 bool DOMNode::isSameNode ( DOMNode $node )

33 bool DOMNode::isSupported ( string $feature , string $version )

34 string DOMNode::lookupNamespaceURI ( string $prefix )

35 string DOMNode::lookupPrefix ( string $namespaceURI )

36 void DOMNode::normalize ( void )

37 DOMNode DOMNode::removeChild ( DOMNode $oldnode )

38 DOMNode DOMNode::replaceChild ( DOMNode $newnode , DOMNode $oldnode )

39 }

复制代

文本型 DOMText 定義如下:

复制代

DOMText は DOMCharacterData を拡張します {

/* プロパティ */

読み取り専用パブリック文字列 $wholeText ;

/* メソッド */

__construct ([ string $value ] )

bool isWhitespaceInElementContent ( void )

DOMText SplitText ( int $offset )

/* 継承されたメソッド */

void DOMCharacterData::appendData ( string $data )

void DOMCharacterData::deleteData ( int $offset , int $count )

void DOMCharacterData::insertData ( int $offset , string $data )

void DOMCharacterData::replaceData ( int $offset , int $count , string $data )

string DOMCharacterData::substringData ( int $offset , int $count )

}

复制代

DOMNode 点の定義は以下の通り:

复制代

DOMNode {

/* プロパティ */

パブリック読み取り専用文字列 $nodeName ;

パブリック文字列 $nodeValue ;

パブリック readonly int $nodeType ;

パブリック読み取り専用 DOMNode $parentNode ;

パブリック読み取り専用 DOMNodeList $childNodes ;

パブリック読み取り専用 DOMNode $firstChild ;

パブリック読み取り専用 DOMNode $lastChild ;

public readonly DOMNode $previousSibling ;

パブリック読み取り専用 DOMNode $nextSibling ;

パブリック読み取り専用 DOMNamedNodeMap $attributes ;

パブリック読み取り専用 DOMDocument $ownerDocument ;

パブリック読み取り専用文字列 $namespaceURI ;

パブリック文字列 $prefix ;

パブリック読み取り専用文字列 $localName ;

パブリック読み取り専用文字列 $baseURI ;

パブリック文字列 $textContent ;

/* メソッド */

DOMNode appendChild ( DOMNode $newnode )

DOMNode cloneNode ([ bool $deep ] )

bool hasAttributes ( void )

bool hasChildNodes ( void )

DOMNode insertBefore ( DOMNode $newnode [, DOMNode $refnode ] )

bool isDefaultNamespace ( string $namespaceURI )

bool isSameNode ( DOMNode $node )

bool isSupported ( string $feature , string $version )

文字列 lookupNamespaceURI ( string $prefix )

文字列 lookupPrefix ( string $namespaceURI )

void 正規化 ( void )

DOMNode deleteChild ( DOMNode $oldnode )

DOMNode replaceChild ( DOMNode $newnode 、 DOMNode $oldnode )

}

复制代

3、测试程序

复制代

1

2

3 const INDEX_FILE_NAME = "student_file_index.xml";

4

5 //文件インデックス类

6 クラス file_index

7 {

8 パブリック関数 set_file_index($file_name, $cur_count, $total_count)

9 {

10 $this->file_name = $file_name;

11 $this->cur_count = $cur_count;

12 $this->total_count = $total_count;

13 }

14 パブリック関数 get_file_name()

15 {

16 return $this->file_name;

17 }

18 パブリック関数 get_cur_count()

19 {

20 return $this->cur_count;

21 }

22 パブリック関数 get_total_count()

23 {

24 return $this->total_count;

25 }

26

27 プライベート $file_name;  //文件名

28 private $cur_count; //現在のレコード数

29 private $total_count; //レコードの総数

30}

31

32 関数 create_file_index(array $params)

33 {

34 $index = new file_index();

35 $index->​​set_file_index($params['file_name'],

36 $params['cur_count'], $params['total_count']);

37 return $index;

38}

39

40 function create_file_node(DOMDocument $doc, file_index $index)

41 {

42 //ファイル要素を作成します

43 $file = $doc->createElement("file");

44 //属性要素を作成します

45 $name_attr = $doc->createAttribute("name");

46 //この属性をファイル要素に追加します

47 $file->appendChild($name_attr);

48

49 //テキスト要素を作成します

50 $file_name = $doc->createTextNode($index->​​get_file_name());

51 //name_attr 属性をテキスト要素に追加します

52 $name_attr->appendChild($file_name);

53

54 //cur_count 要素を作成します

55 $cur_count = $doc->createElement("cur_count", strval($index->​​get_cur_count()));

56 //ファイル要素に cur_count を追加します

57 $cur_count = $file->appendChild($cur_count);

58

59 //total_count 要素を作成します

60 $total_count = $doc->createElement("total_count",

61 strval($index->​​get_total_count()));

62 //total_count をファイル要素に追加します

63 $total_count = $file->appendChild($total_count);

64

65 return $file;

66 }

67

68 関数 create_index_file($index_file_name, array $params)

69 {

70 //ドキュメントを作成します

71 $doc = new DOMDocument("1.0", "utf-8");

72 //ルート要素を作成

73 $root = $doc->createElement("index");

74 $root = $doc->appendChild($root);

75

76 //インデックス構造を作成します

77 $index = create_file_index($params);

78 $file = create_file_node($doc, $index);

79

80 //ルート要素以下のファイルを表示

81 $root->appendChild($file);

82 $doc->save($index_file_name);

83 true を返します

84 }

85

86 関数 add_index_file($index_file_name, array $params)

87 {

88 //ドキュメントを作成します

89 $doc = 新しい DOMDocument();

90 //xml ファイルをロード

91 $doc->load($index_file_name);

92 //インデックス要素リストを取得します

93 $node_list = $doc->getElementsByTagName('index');

94 //ルート要素を取得します

95 $root = $node_list->item(0);

96 //インデックス構造を作成します

97 $index = create_file_index($params);

98 $file = create_file_node($doc, $index);

99 //ルート要素の下のファイルを参照

100 $root->appendChild($file);

101 $doc->save($index_file_name);

102}

103

104 関数 traverse_file_index($index_file_name)

105 {

106 $file_index = array();

107 $doc = new DOMDocument();

108 $doc->load($index_file_name);

109 //ファイル要素のコレクションを取得します

110 $file_list = $doc->getElementsByTagName('file');

111 //cur_count 要素コレクションを取得

112 $cur_count_list = $doc->getElementsByTagName('cur_count');

113 //total_count 要素コレクションを取得します

114 $total_count_list = $doc->getElementsByTagName('total_count');

115 for ($i = 0; $i length; $i++) {

116 $index = new file_index();

117 //ファイル要素のname属性値を取得します

118 $file_name = $file_list->item($i)->attributes->getNamedItem("name")->nodeValue;

119 $index->​​set_file_index($file_name, $cur_count_list->item($i)->nodeValue,

120 $total_count_list->item($i)->nodeValue);

121 $file_index[$i] = $index;

122 }

123

124 return $file_index;

125 }

126

127 /*****************テスト用*********************/

128 $params = array();

129 $index_file_name = INDEX_FILE_NAME;

130

131 if (file_exists($index_file_name)) {

132 $params['file_name'] = "student_info_2014_02_12";

133 $params['cur_count'] = 10;

134 $params['total_count'] = 10;

135 echo "file.n にインデックスを追加";

136 add_index_file($index_file_name, $params);

137 }

138 他 {

139 $params['file_name'] = "student_info_2014_02_11";

140 $params['cur_count'] = 23;

141 $params['total_count'] = 33;

142 echo "インデックスファイルを作成.n";

143 create_index_file($index_file_name, $params);

144 }

145

146 //测试读取xm文件

147 echo "「.$index_file_name."n からインデックスの内容を読み取ります」;

148 echo "file_nametttcur_countttotal_count.n";

149 $file_index = traverse_file_index($index_file_name);

150 foreach($file_index as $index) {

151 echo $index->​​get_file_name();

152 echo "tt ";

153 echo $index->​​get_cur_count();

154 echo strval($cur_count);

155 echo "tt ";

156 echo $index->​​get_total_count();

157 echo "n";

158 }



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。