2013-12-18 104 views
0

我有一個PHP頁面,服務在捐贈時發出通知。我的PHP頁面應該獲取XML內容並解析出來進行處理。在PHP和WordPress中解析來自URL變量的XML數據

服務發送的格式如下:

http://myserver.com/myphp.com?details= xml data 

我有以下代碼監聽這個帖子:

//Load xml from post 
$data = file_get_contents('php://input'); 
$xmlData = simplexml_load_string($data); 
//grab mobile number to query mgive for user info 
$mnumb= $xmlData->MobileNumber; 
$mnumb=ltrim($mnumb,'1'); 

我收到以下錯誤,當服務發出的通知。 警告:simplexml_load_string()[function.simplexml-load-string]:Entity:line 1:parser error:Start tag expected,'<'

我在想什麼或編碼錯誤?

12-18-2013 855cst 謝謝ThW ..正在取得進展。

我用你的建議#2來獲取數據。 當我做一個print_r(xmlData)時,屏幕上沒有輸出。但是,使用Chrome開發人員工具時,會得到以下輸出: data =%3C%3Fxml + version%3D%221.0%22 + encoding%3D%22utf-8%22%3F%3E%3CGetDonationStatusResult + xmlns%3Axsi% 3D%22http%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema實例%22周+的xmlns%3Axsd%3D%22http%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema%22%3E%3CResultCode +% 3E0%3C%2FResultCode%3E%3CResultText +%2F%3E%3CRecordID +%3E0%3C%2FRecordID%3E%3CMobileNumber +%3E12142911111%3C%2FMobileNumber%3E%3CCarrierID +%3E31002%3C%2FCarrierID%3E%3CCarrierName +%3EAT%26安培% 3BT +無線%3C%2FCarrierName%3E%3CDonationStatus +%3EUserAccepted%3C%2FDonationStatus%3E%3CMobileTransactionID +%3E62622731%3C%2FMobileTransactionID%3E%3CDonationMsgGUID +%3E9c17d57f-b54e-488A-8cf5-1c658d1aa618%3C%2FDonationMsgGUID%3E%3CCampaignID +% 3E20409%3C%2FCampaignID%3E%3CShortCode +%3E27722%3C%2FShortCode%3E%3CMsgTime +%3E2013-12-17T12%3A53 3A18%%3C%2FMsgTime%3E%3CMessageText +%3ELIBERIA + WAP%3C%2FMessageText%3E%3C% 2FGetDonationStatusResult%3E & *

您可以看到MobileNumber已發送。但是,當我回顯$ mnumb時,我沒有輸出。我在使用simplexml_load_string($ data)時丟失了一些東西;抓住MobileNumber?

+0

你能表現出合作的例子你實際傳遞給它的XML? – Zarathuztra

+0

<?xml version =「1.0」encoding =「utf-8」?><移動電話號碼> 19191112222 AT & T無線 UserAccepted 2013-12-17T20:53:05 LIBERIA WAP

+0

這正是您在echo $ data;時得到的結果嗎?你100%確定? –

回答

0

目前尚不清楚從哪裏獲取xml數據。

  1. 閱讀來自從數據參數讀取在url $xml = $_GET['data'];
  2. 從在請求主體(後)$xml = $_POST['data'];
  3. 數據參數讀取在url $xml = $_GET['detail'];
  4. 細節參數讀取的原始交數據$xml = file_get_contents("php://input");

嘗試的var_dump()中的數據:

var_dump($_GET, $_POST); 

後你得到了XML到一個變量使用DOM + XPath來從中提取值:

$xml = <<<'XML' 
<?xml version="1.0" encoding="utf-8"?> 
<GetDonationStatusResult xmlns:xsi="w3.org/2001/XMLSchema-instance" xmlns:xsd="w3.org/2001/XMLSchema"> 
    <ResultCode >0</ResultCode> 
    <ResultText /> 
    <RecordID >0</RecordID> 
    <MobileNumber >19191112222</MobileNumber> 
    <CarrierID >31002</CarrierID> 
    <CarrierName >AT&amp;T Wireless</CarrierName> 
    <DonationStatus >UserAccepted</DonationStatus> 
    <MsgTime >2013-12-17T20:53:05</MsgTime> 
    <MessageText >LIBERIA WAP</MessageText> 
</GetDonationStatusResult> 
XML; 

$dom = new DOMDocument(); 
// try to load the xml 
if ($dom->loadXml($xml)) { 
    $xpath = new DOMXpath($dom); 
    // read the first MobileNumber element as string 
    var_dump(
    $xpath->evaluate('string(//MobileNumber)') 
); 
} 

輸出:

string(11) "19191112222" 

Live Result

+0

好的答案,但他已經在使用SimpleXML對象,不需要擔心製作DOM對象(除非我們想製作CDATA元素;)) – Zarathuztra

+0

SimpleXML相當有限,只有一個包裝器圍繞DOMDocument。例如,它的xpath()方法不能返回標量值。我懶得使用它。 – ThW

+1

太懶了?我發現,SimpleXML和底層的DOMDocument相結合是處理PHP中較小數據集的XML的最有效方式。那麼xpath不能返回標量值是什麼意思?這不是它的目的。 – Zarathuztra