SimpleXML:根据子元素内容选择父节点
解决SimpleXML定位指定节点的问题
我来帮你搞定这个XML节点查询的问题!你当前的代码有两个关键问题,咱们一步步修正:
问题分析
- 方法用错了:SimpleXML对象没有
query()方法,执行XPath查询应该用xpath()方法。 - XPath定位偏差:你当前的XPath选中的是
<Name>子元素,但你实际需要的是它的父节点<WebFilterCategory>。
修正后的代码
如果是精确匹配<Name>的值为"Categoryname2",用下面的代码最简洁:
$xmlstring = <<<XML <?xml version="1.0" encoding="UTF-8"?> <Request> <Login> <UserName>admin</UserName> <Password>admin</Password> </Login> <Set Operation="get"> <WebFilterCategory transactionid=""> <Name>Categoryname1</Name> <Classification>Objectionable</Classification> <DomainList> <Domain>example1.com</Domain> <Domain>example2.com</Domain> </DomainList> </WebFilterCategory> <WebFilterCategory transactionid=""> <Name>Categoryname2</Name> <Classification>Objectionable</Classification> <DomainList> <Domain>example1.org</Domain> <Domain>example2.org</Domain> </DomainList> </WebFilterCategory> </Set> </Request> XML; $xml = simplexml_load_string($xmlstring) or die("Error: Cannot create object"); // 用xpath直接定位到符合条件的WebFilterCategory节点 $categories = $xml->xpath('//WebFilterCategory[Name="Categoryname2"]'); // 遍历匹配到的节点(如果有多个匹配的话) foreach ($categories as $category) { // 输出节点内容,比如打印分类名称和域名列表 echo "分类名称: " . (string)$category->Name . "\n"; echo "域名列表:\n"; foreach ($category->DomainList->Domain as $domain) { echo "- " . (string)$domain . "\n"; } }
更灵活的XPath写法
如果你需要的是模糊匹配(比如Name包含指定字符串),可以把XPath改成:
//WebFilterCategory[contains(Name, "Categoryname2")]
额外提示
如果确定只会有一个匹配的节点,你可以直接取数组的第一个元素,省去循环:
if (!empty($categories)) { $targetCategory = $categories[0]; echo "目标分类: " . (string)$targetCategory->Name; }
内容的提问来源于stack exchange,提问作者Madamadam
相关产品推荐
相关产品推荐

