免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4427 | 回复: 7
打印 上一主题 下一主题

[DOM树路径] PHP里面如何方便的得到DOM tree的路径? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-18 23:10 |只看该作者 |倒序浏览
应用中需要遍历一个HTML文档,要把某个元素的tree路径记下来,怎么实现思路。

例如记下所有A标记的路径:
<html>
<body>
<a href=ddddddddd></a>
<ul>
  <li>
   <div><a href=kkkkkk></div>
  </li>
</ul>
</body>
</html>

希望能得到:
$link = array( "html>body", "html>body>ul>li>div" );

论坛徽章:
0
2 [报告]
发表于 2007-09-19 11:37 |只看该作者
<?php
// PECL
// extension=php_domxml.dll

/*
<html>
<body>
<a href="ddddddddd"></a>
<ul>
  <li>
   <div><a href="kkkkkk"></a></div>
  </li>
</ul>
</body>
</html>
*/
if (!$dom = domxml_open_file('d:/phpcode/example.html')) {
   echo 'error while parsing the document!'."\n";
   exit;
}
//$root = $dom->document_element();

$array = $dom->get_elements_by_tagname('a');

$arr = array();
if (count($array)>0) {
   for($i=0;$i<count($array);$i++) {
      $arr[] = getParent($array[$i], $array[$i]->node_name());
   }
}
var_dump($arr);

function getParent($nod, &$str) {
   if ($nod->parent_node() !== null) {
          $str = $nod->parent_node()->node_name().'->'.$str;
      getParent($nod->parent_node(), $str);
   }
   return $str;
}
?>

论坛徽章:
0
3 [报告]
发表于 2007-09-19 20:46 |只看该作者
谢谢~~

论坛徽章:
0
4 [报告]
发表于 2007-09-20 18:38 |只看该作者
但有个问题,DOMXML库在php5.1中不能用

XXXI. DOM XML Functions
简介
The DOM XML extension has been overhauled in PHP 4.3.0 to better comply with the DOM standard. The extension still contains many old functions, but they should no longer be used. In particular, functions that are not object-oriented should be avoided.

The extension allows you to operate on an XML document with the DOM API. It also provides a function domxml_xmltree() to turn the complete XML document into a tree of PHP objects. Currently, this tree should be considered read-only - you can modify it, but this would not make any sense since DomDocument_dump_mem() cannot be applied to it. Therefore, if you want to read an XML file and write a modified version, use DomDocument_create_element(), DomDocument_create_text_node(), set_attribute(), etc. and finally the DomDocument_dump_mem() function.

注: 本扩展已被移动到 PECL 库中且自以下版本起不再被绑定到 PHP 中:5.0.0.

注: This extension is no longer marked experimental. It will, however, never be released with PHP 5, and will only be distributed with PHP 4. If you need DOM XML support with PHP 5 you can use the DOM extension. This domxml extension is not compatible with the DOM extension.

论坛徽章:
0
5 [报告]
发表于 2007-09-20 20:30 |只看该作者
注: 本扩展已被移动到 PECL 库中且自以下版本起不再被绑定到 PHP 中:5.0.0.

注: This extension is no longer marked experimental. It will, however, never be released with PHP 5, and will only be distributed with PHP 4. If you need DOM XML support with PHP 5 you can use the DOM extension. This domxml extension is not compatible with the DOM extension.


手册说DOMXML在PHP4中是可用的,在php5以后不被默认支持,建议使用DOM,但DOM和DOMXML互不兼容,php4中能用DOMXML不能用DOM,php5中能用DOM不能用DOMXML,而楼上的解决方法是用的DOMXML,但这个类库只针对规范的XML,对HTML就容易出错,因为HTML中不一定写的规范,比如还有相当的网页中是用的<br>而不是<br/>,因为没有闭合标记导致出错。但PHP5中的DOM就可以处理HTML,郁闷的是似乎没有提供遍历节点的函数?如类似DOMXML中的parent_node()函数就没有。

简单说,楼上的例子如果用用php5所支持的DOM库能不能实现?楼上帮看一下,实在不行的话我再想办法

论坛徽章:
0
6 [报告]
发表于 2007-09-21 02:57 |只看该作者
DOMNode有parentNode属性

论坛徽章:
0
7 [报告]
发表于 2007-09-22 22:19 |只看该作者
我用的php5,在扩展中已经有了php_domxml.dll,你只需要在php.ini中添加extension=php_domxml.dll就可以了

论坛徽章:
0
8 [报告]
发表于 2007-09-23 15:40 |只看该作者
原帖由 jiayanaibaobao 于 2007-9-22 22:19 发表
我用的php5,在扩展中已经有了php_domxml.dll,你只需要在php.ini中添加extension=php_domxml.dll就可以了


不可能吧。我用的PHP5.2.0,根本就不带这个。去PECL库下载domxml装了也没用。以下是PHP520版的默认extension

;extension=php_mbstring.dll
;extension=php_bz2.dll
;extension=php_curl.dll
;extension=php_dba.dll
;extension=php_dbase.dll
;extension=php_exif.dll
;extension=php_fdf.dll
;extension=php_filepro.dll
;extension=php_gd2.dll
;extension=php_gettext.dll
;extension=php_ifx.dll
;extension=php_imap.dll
;extension=php_interbase.dll
;extension=php_ldap.dll
;extension=php_mcrypt.dll
;extension=php_mhash.dll
;extension=php_mime_magic.dll
;extension=php_ming.dll
;extension=php_mssql.dll
;extension=php_msql.dll
;extension=php_mysql.dll
;extension=php_oci8.dll
;extension=php_openssl.dll
;extension=php_oracle.dll
;extension=php_pgsql.dll
;extension=php_shmop.dll
;extension=php_snmp.dll
;extension=php_sockets.dll
;extension=php_sqlite.dll
;extension=php_sybase_ct.dll
;extension=php_tidy.dll
;extension=php_xmlrpc.dll
;extension=php_xsl.dll


可以看出,自PHP5以后,php_domxml.dll已被移出,不再默认安装

仔细看手册上的意思说这个库以后会抛弃,建议用DOMDocument类  
不过这个DOMDocument类确实好用很多
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP