You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 18:08:13