Существует тонна из существующих вопросов о PHP SimpleXML и обработке XML с пространствами имен. Все вопросы, на которые я смотрел, сделали фундаментальное предположение: код заранее знает, какие пространства имен будут включены во входящий SOAP-запрос. В моем случае я видел несогласованные пространства имен в запросах SOAP.
В частности, я работал над реализацией веб-службы для общения с Quickbooks Web Connector (pdf), и некоторые примеры запросов, которые я видел, выглядят так:
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:dev="http://developer.intuit.com/">
<soapenv:Header/>
<soapenv:Body>
<dev:authenticate>
<dev:strUserName>username</dev:strUserName>
<dev:strPassword>password</dev:strPassword>
</dev:authenticate>
</soapenv:Body>
</soapenv:Envelope>
... а некоторые выглядят так:
<s11:Envelope
xmlns:s11='http://schemas.xmlsoap.org/soap/envelope/'
xmlns:ns1='http://developer.intuit.com/'>
<s11:Header/>
<s11:Body>
<ns1:authenticate>
<ns1:strUserName>username</ns1:strUserName>
<ns1:strPassword>password</ns1:strPassword>
</ns1:authenticate>
</s11:Body>
</s11:Envelope>
... или это:
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://developer.intuit.com/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<ns1:authenticate>
<ns1:strUserName>username</ns1:strUserName>
<ns1:strPassword>password</ns1:strPassword>
</ns1:authenticate>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Я понимаю, что использование xpath () для выбора элементов, но это предполагает, что вы знаете, в каком пространстве имен искать. Без какой-либо согласованности в пространстве имен, мне трудно понять, как правильно и программно выбрать содержимое узел для обработки.
Пространство имен совершенно не имеет значения в этом приложении - могу ли я просто запустить необработанный XML через регулярное выражение, чтобы сначала удалить whatever:
из <whatever:mytag>
?