<?php /** * DOMXML函数笔记 * 连接php_domxml.dll后 * 用get_defined_functions()得到domxml支持函数 * * 目前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() 函数进行处理 * * 函数列表 * 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 * */ ?> <pre> <?php // 文档 xml源树.xml 内容 $testxml = ' <?xml version="1.0" encoding="GB2312"?> <root> <note>读取xml文档时,处理器将形成一个树,我们将其叫做源树。该树具有表中的各种类型的节点。 </note> <title>源树具有的节点</title> <table> <tr><th>节点类型</th><th>说明</th></tr> <tr><td>Root(根)</td><td>这是树的根节点。可以出现在树的任何地方。根节点只具有一个子节点,子节点指的是xml文档中的文档元素节点。</td></tr> <tr><td>Element(元素)</td><td>这种节点用于文档中的任何元素。元素节点的子节点可以是其内容的元素节点、注释节点、处理信息节点以及文本节点。</td></tr> <tr><td>Text(文本)</td><td>文档中出现的所有文本,都分组归入到文本节点中。文本节点不可以有同为文本节点的紧接着的前或后的兄弟节点。</td></tr> <tr><td>Attribute(属性)</td><td>每一个元素节点都有一套自己附加的属性节点。默认的属性值以与指定属性一样的方法来处理。这些节点都没有子节点。</td></tr> <tr><td>Namespace(名称)</td><td>对于每一个以xlmns:和属性节点开头的元素,都有一个名称空格节点。这些节点没有子节点。</td></tr> <tr><td>Processing Instruction(处理指令)</td><td>每一个处理指令都有一个单独的节点。这些节点都没有子节点。</td></tr> <tr><td>Comment(注释)</td><td>每一个都有一个注释节点。这些节点都没有子节点。</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); // 删除语言设定 //$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解析<br>"; echo "<textarea cols=60 rows=5>$myxml</textarea><br>"; //print_r($doc); // 可以看到整个树 亦可用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); // 只能看到根节点
// 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<br>"; echo "<textarea cols=60 rows=5>$myxml</textarea><br>";
// 节点的遍历 /** 节点结构 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 = '<?xml version="1.0" encoding="gb2312"?>'."\n"; if(count($xmldoc->children) == 1) // 根节点,没有其他成员 $docs[] = $xmldoc->root(); else $docs = $xmldoc->children(); // 根节点,有其他成员 }else { $docs = $xmldoc->children(); // 一般节点 } // echo __LINE__."<br>"; 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 .= "</{$doc->tagname}>"; // 闭合标签 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 "自己写一个dumpmem就不出错了<br>"; echo "<textarea cols=60 rows=5>$myxml</textarea><br>"; print_r($doc);
?> </pre>
|