使用 SimpleXMLParser 获取嵌套节点值

Get nested node value with SimpleXMLParser

我有一个简单的 XML 响应,我正在接收一个变量($response):

<tsresponse xmlns="http://tableau.com/api" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://tableau.com/api http://tableau.com/api/ts-api-3.7.xsd">
   <pagination pagenumber="1" pagesize="100" totalavailable="1">
      <users>
         <user externalauthuserid="" id="abcd1234-hijk-lmno-1234-abcd9876" name="TestUsername" siterole="Explorer">
         </user>
      </users>
   </pagination>
</tsresponse>

我正在尝试检索“id”的值。

$xml=simplexml_load_string($response) or die("Error: Cannot create object");
            
$tableauuserid = $xml->pagination->users[0]->user['id'];
echo "The (existing) Tableau User ID is: ". $tableauuserid;

(大部分)相同的格式适用于我在类似响应中检索 id 值的级别 - 除了那时我只处理“用户”而不是“分页->用户->用户”。当前变量 $tableauuserid 为空。

关于如何检索 id 的值有什么想法吗?

查找任何 <user> 元素的一种简单方法是使用 XPath。唯一有点复杂的是在基本元素上定义的默认命名空间。要解决这个问题,您需要注册该名称空间(使用 registerXPathNamespace()),然后使用前缀作为名称的一部分。

调用xpath()会return一个匹配节点的列表,所以需要[0]才能使用第一个...

$xml->registerXPathNamespace("d", "http://tableau.com/api");
$user = $xml->xpath("//d:user[@id]");
$tableauuserid = $user[0]['id'];