使用命名空间提取 SimpleXML 属性

Pulling SimpleXML Attributes with Namespaces

我正在尝试显示来自 SOAP API 的多条记录。我的呼叫工作正常,这是预期的 XML 响应:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <GetDataResponse xmlns="urn:com:esi911:webeoc7:api:1.0">
            <GetDataResult>
                <data>
                    <record dataid="6" county="Fayette County" title="Title goes here" description="Description goes here." status="Inactive" />
                    <record dataid="5" county="Caldwell County" title="Title goes here" description="Description goes here." status="Inactive" />
                    <record dataid="4" county="Burnet County" title="Title goes here" description="Description goes here." status="Active" />
                    <record dataid="2" county="Blanco County" title="Title goes here" description="Description goes here." status="Active" />
                    <record dataid="1" county="Bastrop County" title="Title goes here" description="Description goes here." status="Active" />
                </data>
            </GetDataResult>
        </GetDataResponse>
    </soap:Body>
</soap:Envelope>

现在,我只想在我的网页上显示这些记录中的第一个及其属性。我将此响应放入 SimpleXML 并尝试获取要显示的多个属性。到目前为止,这是我基于各种其他 Whosebug 示例所做的尝试,但 none 确实与我上面的确切 XML 响应结构相匹配:

$xml = simplexml_load_string($response);
$response = $xml->xpath("//soap:Body/*")[0];
$result = $response->children("urn:com:esi911:webeoc7:api:1.0");
echo (string) $result->data->record[0]->attributes()->dataid;

我从来没有收到任何具体错误。一直都是空白,什么都不显示。

最终,我需要遍历这些记录以显示它们或将它们存储到它们自己的数组中以供以后其他用途,但我似乎无法从上面的代码中回显任何内容。我确定它可能与多个名称空间有关?或者只是某个地方的基本错字?

任何关于此 XML 回复的建议都会很棒。谢谢!

您缺少 <GetDataResult> 元素级别,您获取 <soap:Body> 标记,然后提取 "urn:com:esi911:webeoc7:api:1.0" 命名空间中的子项 - 这将为您提供 <GetDataResponse>元素,所以...

echo (string) $result->GetDataResult->data->record[0]->attributes()->dataid;

您可以先 register the namespace 然后通过单个 xpath 查询获得所需的结果:

$xml = simplexml_load_string($response);
$xml->registerXPathNamespace('urn', 'urn:com:esi911:webeoc7:api:1.0');
$records = $xml->xpath('//urn:record');

echo (string)$records[0]->attributes()->dataid;

演示:https://3v4l.org/f8faC

注意:您可以更准确地使用类似 //urn:GetDataResult/urn:data/urn:record(而不是较短的 //urn:record)的内容作为 XPath 查询,以防万一可以在您收到的 XML 中的另一个地方记录。