DOMXML函數筆記_PHP教程

來源:互聯網
上載者:User
/**
* DOMXML函數筆記
* 串連php_domxml.dll後
* 用get_defined_functions()得到domxml支援函數
*
* 目前domxml不支援非iso-8859-1以外的語言聲明
* 支援
* 不支援
* 因此需要改造成這樣,可能需要
* utf8_encode() utf8_decode() 函數進行處理
*
* 函數列表
* string domxml_version(void) 返回domxml的版本號碼
* object xmldoc(string str) 從字串建立XML的Domdocument對象
* object xmldocfile(string filename) 從檔案建立XML的Domdocument對象
* object xmltree(string str) 解析xml文檔,返回樹狀結構,不能用domxml函數改變
* resource domxml_add_root(resource doc,string name) 添加根節點
* string domxml_dumpmem(resource doc) 將domxml對象轉化為XML串。這個函數有一個問題,他會在第一個漢字前面加一個擴充ascii字元,形如&#nnn;
* domxml_node_attributes
* domxml_elem_get_attribute
* domxml_elem_set_attribute
* array domxml_node_children(object doc|node) 返回子節點
* domxml_node_new_child
* object domxml_node(string name) 建立一個節點節點
* domxml_node_unlink_node
* int domxml_node_set_content(resource doc,string content) 設定節點內容
* object domxml_new_xmldoc(string version) 建立新的空XML對象
* xpath_new_context
* xpath_eval
* xpath_eval_expression
* xptr_new_context
* xptr_eval
* object domxml_root(object doc) 返回根節點
* array domxml_attributes(resource note) 擷取節點屬性
* 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) 返回子節點
* resource domxml_new_child(string name,string content) 添加子節點
* domxml_unlink_node
* set_content
* new_xmldoc
*
*/
?>

// 文檔 xml源樹.xml 內容
$testxml = '


讀取xml文檔時,處理器將形成一個樹,我們將其叫做源樹。該樹具有表中的各種類型的節點。

源樹具有的節點









節點類型說明
Root(根)這是樹的根節點。可以出現在樹的任何地方。根節點只具有一個子節點,子節點指的是xml文檔中的文件項目節點。
Element(元素)這種節點用於文檔中的任何元素。元素節點的子節點可以是其內容的元素節點、注釋節點、處理資訊節點以及文本節點。
Text(文本)文檔中出現的所有文本,都分組歸入到文本節點中。文本節點不可以有同為文本節點的緊接著的前或後的兄弟節點。
Attribute(屬性)每一個元素節點都有一套自己附加的屬性節點。預設的屬性值以與指定屬性一樣的方法來處理。這些節點都沒有子節點。
Namespace(名稱)對於每一個以xlmns:和屬性節點開頭的元素,都有一個名稱空格節點。這些節點沒有子節點。
Processing Instruction(處理指示)每一個處理指示都有一個單獨的節點。這些節點都沒有子節點。
Comment(注釋)每一個都有一個注釋節點。這些節點都沒有子節點。


';

echo "domxml版本:".domxml_version();
echo "

";
// xmltree domxml_dumpmem
$filename = "xml源樹.xml";
//$filename = "resume.xml";
$fp = fopen($filename,"r");
$inXML = fread($fp,filesize($filename));
fclose($fp);
// 刪除語言設定
//$inXML = str_replace(' encoding="GB2312"',"",$inXML);
$inXML = eregi_replace(' encoding="[a-z0-9_-]+"',"",$inXML);

$doc = xmltree($inXML); // 使用xmltree解析
$myxml = $doc->dumpmem(); // 轉換成字串,頭為 xml version="1.0"
// 如果再執行一次,頭將變成 xml version="1.0" encoding="ISO-8859-1"
//$myxml = eregi_replace('&#[0-9]+;',"",$myxml); // 刪除
echo "用xmltree解析
";
echo "$myxml
";
//print_r($doc); // 可以看到整個樹 亦可用var_dump($doc);

// xmldoc
$doc = xmldoc($inXML);
$myxml = $doc->dumpmem();
echo "用xmldoc解析
";
echo "$myxml
";
//print_r($doc); // 只能看到根節點

// 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"); // 設定節點的內容,多次執行是疊加的
domxml_node_set_content($head,"ttt");

// 是乎函數名中只有1-2個"_"的函數,可作為對象的方法使用

$myxml = $doc->dumpmem();
echo "自訂xml
";
echo "$myxml
";

// 節點的遍曆
/**
節點結構
DomElement Object
type = 1
tagname = 節點名
DomText Object
type = 3
content = 節內容點
DomCData Object
type = 4
content = 節內容點

DomProcessingInstruction Object
type 無
target = 處理指示
data = 參數

*/
$ar[] = $doc->root(); // 取得根節點
$ar[] = $ar[count($ar)-1]->children();
$ar[] = $ar[count($ar)-1][0]->children();

// 函數domxml_children() 不能返回節點參數
// 返回節點參數需要使用domxml_attributes()
//var_dump(domxml_attributes($head));
//print_r($ar[1][0]->attributes());
//print_r($ar);

function xml_dumpmem($xmldoc) {
static $mode = 0;
$xmlstr = "";
// 擷取節點,儲存在數組中
if(get_class($xmldoc) == "DomDocument") {
$xmlstr = ''."\n";
if(count($xmldoc->children) == 1) // 根節點,沒有其他成員
$docs[] = $xmldoc->root();
else
$docs = $xmldoc->children(); // 根節點,有其他成員
}else {
$docs = $xmldoc->children(); // 一般節點
}

// echo __LINE__."
";
foreach($docs as $doc) {
$attr = $doc->attributes();
switch($doc->type) {
case 1:
$xmlstr .= "<{$doc->tagname}"; // 標籤頭
if($attr) {
foreach($attr as $key)
$xmlstr .= " {$key->name}=\"{$key->value}\""; // 標籤參數
}
$xmlstr .= ">"; // 標籤結束
$xmlstr .= xml_dumpmem($doc); // 進入子節點
$xmlstr .= "tagname}>"; // 閉合標籤
break;
case 3:
$xmlstr .= $doc->content;
break;
case 4:
$xmlstr .= " $xmlstr .= $doc->content;
$xmlstr .= "]]>";
break;
default:
if(get_class($doc) == "DomProcessingInstruction") {
$xmlstr .= "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 "自己寫一個dumpmem就不出錯了
";
echo "$myxml
";
print_r($doc);

?>

http://www.bkjia.com/PHPjc/313922.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/313922.htmlTechArticle?php /** * DOMXML函數筆記 * 串連php_domxml.dll後 * 用get_defined_functions()得到domxml支援函數 * * 目前domxml不支援非iso-8859-1以外的語言聲明 * ?xml vers...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.