我正在学习 PHP SimpleXML,我有一些问题。我一直在玩从我工作的 Intranet 中的 web 获取代码。我尽可能需要通用代码,因为代码可能随时更改。在我的示例中,我选择了一个 div 标签及其所有子标签。
... <div class="cabTabs"> <ul> <li><a href="/link1">Info1</a></li> <li><a href="/link2">Info2</a></li> <li><a href="/link3">Info3</a></li> </ul> </div> ... //Get all web content: $b = new sfWebBrowser(); //using symfony 1.4.17 sfWebBrower to get a SimpleXML object. $b->get('http://intranetwebexample'); //returns a sfWebBrower object. $xml = $b->getResponseXML(); //returns a SimpleXMLElement //[Eclipse xdebug Watch - $xml] "$xml" SimpleXMLElement @attributes Array [3] head SimpleXMLElement body SimpleXMLElement //Get the div class="cabTabs". $result = $xml->xpath('//descendant::div[@class="cabTabs"]'); //[Eclipse xdebug Watch - $result] "$result" Array [1] 0 SimpleXMLElement @attributes Array [1] class cabTabs ul SimpleXMLElement li Array [6]
问题:
- 使用 descendant:: 前缀:
我在其他 stackoverflow 主题中读到不推荐使用 descendant:: 前缀。为了选择标签及其所有内容,正确的方法应该是什么?我使用上面的代码,但不知道它是否正确。 - 检查 Eclipse xdebug 变量 Watch 的一些问题:
2.1 有时我不能将 SimpleXML 树扩展不止一层。在上面的示例中,我无法访问/查看下面的“li”节点,也无法查看其子节点。
可能是 xdebug 调试器与 SimpleXML 对象的限制,还是 Eclipse Watch 的限制?
当我使用通常的循环访问其父节点时,我可以完美地展开/查看“li”节点:foreach($ul->li as $li)。
然而它不是一个严重的错误,我认为直接看到它并在适当的论坛上报告它是完美的。
2.2 我完全看不懂$xml->xpath的结果代码:
如果我们看一下Eclipse Watch,“div”标签已经转换为0索引键,但是“ul”和“li”标签有它们原来的名字,为什么?
2.3 如何使用通用代码访问/循环 xpath 内容:
我使用以下非通用代码来访问它:
foreach ($result as $record) { foreach($record->ul as $ul) { foreach($ul->li as $li) { foreach($li->a as $a) { echo ' ' . $a->name; } } } }
上面的代码有效,但前提是我们编写了正确的标签名称。(->ul, ->li, ->a..)
遍历所有内容而不必每次都指定子名称的通用方法是什么?(->ul, ->li, ->a..)
此外,我宁愿不必将其转换为数组,除非它是正确的方法。
我一直在尝试使用 children() 属性,但它不起作用,它在该行停止并崩溃: foreach ($result->children() as $ul)
非常感谢您花时间阅读我的问题。非常欢迎任何帮助:)
系统信息:
symfony 1.4.17 和 sfWebBrowserPlugin、cURL dadapter。
启用了 cURL 支持的 PHP 5.4.0,cURL 信息 7.24.0