|
<?php /** * DOMXML函數(shù)筆記 * 連接php_domxml.dll后 * 用get_defined_functions()得到domxml支持函數(shù) * * 目前domxml不支持非iso-8859-1以外的語言聲明 * <?xml version="1.0" encoding="iso-8859-1"?> 支持 * <?xml version="1.0" encoding="gb2312"?> 不支持 * <?xml version="1.0"?> 因此需要改造成這樣,可能需要 * utf8_encode() utf8_decode() 函數(shù)進(jìn)行處理 * * 函數(shù)列表 * string domxml_version(void) 返回domxml的版本號(hào) * object xmldoc(string str) 從字符串創(chuàng)建XML的Domdocument對象 * object xmldocfile(string filename) 從文件創(chuàng)建XML的Domdocument對象 * object xmltree(string str) 解析xml文檔,返回樹狀結(jié)構(gòu),不能用domxml函數(shù)改變 * resource domxml_add_root(resource doc,string name) 添加根節(jié)點(diǎn) * string domxml_dumpmem(resource doc) 將domxml對象轉(zhuǎn)化為XML串。這個(gè)函數(shù)有一個(gè)問題,他會(huì)在第一個(gè)漢字前面加一個(gè)擴(kuò)展ascii字符,形如nnn; * domxml_node_attributes * domxml_elem_get_attribute * domxml_elem_set_attribute * array domxml_node_children(object doc|node) 返回子節(jié)點(diǎn) * domxml_node_new_child * object domxml_node(string name) 創(chuàng)建一個(gè)節(jié)點(diǎn)節(jié)點(diǎn) * domxml_node_unlink_node * int domxml_node_set_content(resource doc,string content) 設(shè)置節(jié)點(diǎn)內(nèi)容 * object domxml_new_xmldoc(string version) 創(chuàng)建新的空XML對象 * xpath_new_context * xpath_eval * xpath_eval_expression * xptr_new_context * xptr_eval * object domxml_root(object doc) 返回根節(jié)點(diǎn) * array domxml_attributes(resource note) 獲取節(jié)點(diǎn)屬性 * object domxml_get_attribute(resource doc,string name) 讀取屬性 * domxml_getattr * object domxml_set_attribute(resource doc,string name,string value) 添加屬性 * domxml_setattr * array domxml_children(object doc|node) 返回子節(jié)點(diǎn) * resource domxml_new_child(string name,string content) 添加子節(jié)點(diǎn) * domxml_unlink_node * set_content * new_xmldoc * */ ?> <pre> <?php // 文檔 xml源樹.xml 內(nèi)容 $testxml = ‘ <?xml version="1.0" encoding="GB2312"?> <root> <note>讀取xml文檔時(shí),處理器將形成一個(gè)樹,我們將其叫做源樹。該樹具有表中的各種類型的節(jié)點(diǎn)。 </note> <title>源樹具有的節(jié)點(diǎn)</title> <table> <tr><th>節(jié)點(diǎn)類型</th><th>說明</th></tr> <tr><td>Root(根)</td><td>這是樹的根節(jié)點(diǎn)。可以出現(xiàn)在樹的任何地方。根節(jié)點(diǎn)只具有一個(gè)子節(jié)點(diǎn),子節(jié)點(diǎn)指的是xml文檔中的文檔元素節(jié)點(diǎn)。</td></tr> <tr><td>Element(元素)</td><td>這種節(jié)點(diǎn)用于文檔中的任何元素。元素節(jié)點(diǎn)的子節(jié)點(diǎn)可以是其內(nèi)容的元素節(jié)點(diǎn)、注釋節(jié)點(diǎn)、處理信息節(jié)點(diǎn)以及文本節(jié)點(diǎn)。</td></tr> <tr><td>Text(文本)</td><td>文檔中出現(xiàn)的所有文本,都分組歸入到文本節(jié)點(diǎn)中。文本節(jié)點(diǎn)不可以有同為文本節(jié)點(diǎn)的緊接著的前或后的兄弟節(jié)點(diǎn)。</td></tr> <tr><td>Attribute(屬性)</td><td>每一個(gè)元素節(jié)點(diǎn)都有一套自己附加的屬性節(jié)點(diǎn)。默認(rèn)的屬性值以與指定屬性一樣的方法來處理。這些節(jié)點(diǎn)都沒有子節(jié)點(diǎn)。</td></tr> <tr><td>Namespace(名稱)</td><td>對于每一個(gè)以xlmns:和屬性節(jié)點(diǎn)開頭的元素,都有一個(gè)名稱空格節(jié)點(diǎn)。這些節(jié)點(diǎn)沒有子節(jié)點(diǎn)。</td></tr> <tr><td>Processing Instruction(處理指令)</td><td>每一個(gè)處理指令都有一個(gè)單獨(dú)的節(jié)點(diǎn)。這些節(jié)點(diǎn)都沒有子節(jié)點(diǎn)。</td></tr> <tr><td>Comment(注釋)</td><td>每一個(gè)都有一個(gè)注釋節(jié)點(diǎn)。這些節(jié)點(diǎn)都沒有子節(jié)點(diǎn)。</td></tr> </table> </root> ‘; echo "domxml版本:".domxml_version(); echo "<p> </p>"; // xmltree domxml_dumpmem $filename = "xml源樹.xml"; //$filename = "resume.xml"; $fp = fopen($filename,"r"); $inXML = fread($fp,filesize($filename)); fclose($fp); // 刪除語言設(shè)定 //$inXML = str_replace(‘ encoding="GB2312"‘,"",$inXML); $inXML = eregi_replace(‘ encoding="[a-z0-9_-] "‘,"",$in="_blank" class="keylink">XML); $doc = xmltree($inXML); // 使用xmltree解析 $myxml = $doc->dumpmem(); // 轉(zhuǎn)換成字串,頭為 xml version="1.0" // 如果再執(zhí)行一次,頭將變成 xml version="1.0" encoding="ISO-8859-1" //$myxml = eregi_replace(‘[0-9] ;‘,"",$myxml); // 刪除 echo "用xmltree解析<br>"; echo "<textarea cols=60 rows=5>$myxml</textarea><br>"; //print_r($doc); // 可以看到整個(gè)樹 亦可用var_dump($doc); // xmldoc $doc = xmldoc($inXML); $myxml = $doc->dumpmem(); echo "用xmldoc解析<br>"; echo "<textarea cols=60 rows=5>$myxml</textarea><br>"; //print_r($doc); // 只能看到根節(jié)點(diǎn) // domxml_new_xmldoc $doc = domxml_new_xmldoc("1.0"); $root = $doc->add_root("HTML"); $head = $root->new_child("HEAD", ""); $head->new_child("TITLE", "DOMXML 測試0"); $head->new_child("TITLE", "DOMXML 測試1"); $head->set_attribute("Language", "ge"); domxml_node_set_content($head,"ppp"); // 設(shè)置節(jié)點(diǎn)的內(nèi)容,多次執(zhí)行是疊加的 domxml_node_set_content($head,"ttt"); // 是乎函數(shù)名中只有1-2個(gè)"_"的函數(shù),可作為對象的方法使用 $myxml = $doc->dumpmem(); echo "自定義xml<br>"; echo "<textarea cols=60 rows=5>$myxml</textarea><br>"; // 節(jié)點(diǎn)的遍歷 /** 節(jié)點(diǎn)結(jié)構(gòu) DomElement Object type = 1 tagname = 節(jié)點(diǎn)名 DomText Object type = 3 content = 節(jié)內(nèi)容點(diǎn) DomCData Object type = 4 content = 節(jié)內(nèi)容點(diǎn) DomProcessingInstruction Object type 無 target = 處理指令 data = 參數(shù) */ $ar[] = $doc->root(); // 取得根節(jié)點(diǎn) $ar[] = $ar[count($ar)-1]->children(); $ar[] = $ar[count($ar)-1][0]->children(); // 函數(shù)domxml_children() 不能返回節(jié)點(diǎn)參數(shù) // 返回節(jié)點(diǎn)參數(shù)需要使用domxml_attributes() //var_dump(domxml_attributes($head)); //print_r($ar[1][0]->attributes()); //print_r($ar); function xml_dumpmem($xmldoc) { static $mode = 0; $xmlstr = ""; // 獲取節(jié)點(diǎn),保存在數(shù)組中 if(get_class($xmldoc) == "DomDocument") { $xmlstr = ‘<?xml version="1.0" encoding="gb2312"?>‘."\n"; if(count($xmldoc->children) == 1) // 根節(jié)點(diǎn),沒有其他成員 $docs[] = $xmldoc->root(); else $docs = $xmldoc->children(); // 根節(jié)點(diǎn),有其他成員 }else { $docs = $xmldoc->children(); // 一般節(jié)點(diǎn) } // echo __LINE__."<br>"; foreach($docs as $doc) { $attr = $doc->attributes(); switch($doc->type) { case 1: $xmlstr .= "<{$doc->tagname}"; // 標(biāo)簽頭 if($attr) { foreach($attr as $key) $xmlstr .= " {$key->name}=\"{$key->value}\""; // 標(biāo)簽參數(shù) } $xmlstr .= ">"; // 標(biāo)簽結(jié)束 $xmlstr .= xml_dumpmem($doc); // 進(jìn)入子節(jié)點(diǎn) $xmlstr .= "</{$doc->tagname}>"; // 閉合標(biāo)簽 break; case 3: $xmlstr .= $doc->content; break; case 4: $xmlstr .= "<![CDATA]["; $xmlstr .= $doc->content; $xmlstr .= "]]>"; break; default: if(get_class($doc) == "DomProcessingInstruction") { $xmlstr .= "<?{$doc->target}"; $xmlstr .= " {$doc->data}?>\n"; } break; } } return $xmlstr; } if(1) { $filename = "resume.xml"; // $filename = "resume.xsl"; $filename = "xml源樹.xml"; $fp = fopen($filename,"r"); $inXML = fread($fp,filesize($filename)); fclose($fp); $inXML = eregi_replace(‘ encoding="[a-z0-9_-] "‘,"",$inXML); // $doc = xmltree($inXML); // 使用xmltree解析 $doc = xmldoc($inXML); // 使用xmldoc解析 } // 不能用來解析xsl文檔 $myxml = xml_dumpmem($doc); echo "自己寫一個(gè)dumpmem就不出錯(cuò)了<br>"; echo "<textarea cols=60 rows=5>$myxml</textarea><br>"; print_r($doc); ?> </pre> |
|
|