Php 使用SimpleXMLParser获取嵌套节点值

Php 使用SimpleXMLParser获取嵌套节点值,php,simplexml,Php,Simplexml,我在变量($response)中接收到一个简单的XML响应: (大部分)相同的格式适用于我在类似响应中检索id值的级别-除了我只处理“user”而不是“pagination->users->user”。当前变量$tableauuserid为空 关于如何检索id的值有什么想法吗?查找任何元素的简单方法是使用XPath。唯一稍微复杂的是在基本元素上定义的默认名称空间。要解决这个问题,您需要注册该名称空间(使用registerXPathNamespace()),然后使用前缀作为名称的一部分 调用xpa

我在变量($response)中接收到一个简单的XML响应:

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


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

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

调用
xpath()
将返回匹配节点的列表,因此您需要使用
[0]
来使用第一个节点

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

无法复制,获取的(现有)Tableau用户ID为:abcd1234-hijk-lmno-1234-abcd9876,与此完全相同code@kerbh0lz,对我来说似乎还可以。@NigelRen Nice,那我们就两个了;)如何设置
$response
?这是工作守则:很高兴知道有些东西对别人有用。。。哈!我将$response设置为curl\u exec调用的结果<代码>$response=curl\u exec($curl)。我在前面的代码中使用了两次相同的方法,所以我有点困惑。当我回显$response时,它看起来很好。虽然我必须承认我不熟悉这个方法,但它非常有效。对于registerXPathNamespace,还有其他需要注意的事项吗?例如,它是否仅在函数运行期间保持?
registerXPathNamespace()
仅存在于您注册它的节点,因此如果您随后从
$tableauuserid
进行查询,则需要再次执行该操作。另一件事是,
$tableauuserid
的结果是SimpleXMLElement的一个实例,因此如果您对它执行某些操作(例如将其用作索引),则需要将其转换为字符串
(string)$tableauuserid
。这预先解决了我可能会遇到的一个问题。非常感谢你!
$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;
$xml->registerXPathNamespace("d", "http://tableau.com/api");
$user = $xml->xpath("//d:user[@id]");
$tableauuserid = $user[0]['id'];