有一個tonofexistingquestions關於PHP的SimpleXML和使用命名空間的處理XML。所有的我看了都取得了基本假設的問題:提前命名空間會是什麼代碼知道要包含在傳入的SOAP請求。就我而言,我在SOAP請求中看到了不一致的名稱空間。PHP的SimpleXML:在SOAP處理未知的命名空間請求
具體來說,我一直在努力實現web服務去跟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()選擇ELE發言:,但假設你知道如何尋找的命名空間中,沒有任何一致性的命名空間,我有一個很難搞清楚如何正確,程序選擇處理節點的內容。
命名空間在這個應用程序中是完全不相關的 - 我可以通過正則表達式運行原始XML以便首先從<whatever:mytag>
中刪除whatever:
?
是的!我將前綴理解爲命名空間的快捷方式。具有諷刺意味的是,我實際上是在嘗試過自己的解決方案之前,無法讓xpath識別我定義的備用前綴。我一定是做錯了事。我顯然還沒有完全理解Xpath。原諒新手跟進問題(在這一點上應該不會令人驚訝),但是如果我不一定知道緊接着身體的下一個標記是什麼,我仍然可以通過通配符選擇它,或者一個使用'/ soap:Envelope/child :: soap:Body'的軸? – beporter 2011-01-27 14:44:29