2012-07-16 72 views
0

我在這裏看到類似主題的各種帖子。不幸的是這些都沒有幫助。從jQuery Ajax php調用返回XML?

我對ajax調用了一個php文件,該文件創建了一個XML文件,我從其中填充適當的表單字段,前提是找到了數據。

如果我指定返回數據爲XML,如下所示,我沒有得到成功,並顯示警告「無法檢索XML文件」。

function check_Address(){ 

alert("username=" + $("#username").attr("value")); 

$.ajax({ 
    type: "POST", 
    url: "admin_Check_Address.php", 
    data: "username=" + $("#username").attr("value"), 
    dataType: "xml",     
    success: function(return_Data){ 
     set_Address(return_Data); 
    }, 
    error: function(return_Data){ 
     alert("Could not retrieve XML file."); 
    } 
}); // end ajax call 
} 

但是,如果我刪除的數據類型我獲得成功的功能SET_ADDRESS被付諸行動,並在return_Data的標記名被發現場已正確安裝。即

function check_Address(){ 

alert("username=" + $("#username").attr("value")); 

$.ajax({ 
    type: "POST", 
    url: "admin_Check_Address.php", 
    data: "username=" + $("#username").attr("value"), 
    success: function(return_Data){ 
     set_Address(return_Data); 
    }, 
    error: function(return_Data){ 
     alert("Could not retrieve XML file."); 
    } 
}); // end ajax call 
} 

這裏是PHP:

<?php 

/* 
* Accept username from Ajax 
* Get appropriate key 
* Check for pre existing address(es) 
*/ 

if(isset($_POST["username"])){ 

    // retrieve user key 

    $sql = "SELECT * FROM User "; 
    $sql .= "WHERE username = "; 
    $sql .= "'"; 
    $sql .= $_POST['username']; 
    $sql .= "'"; 
    $sql .= " LIMIT 1;"; 
    $user = User::find_By_Sql($sql); 
    $user_Key = $user[0]->get_User_Key(); 

    // check for an existing address or addresses 

    $sql = "SELECT * FROM Address "; 
    $sql .= "WHERE user_Key = "; 
    $sql .= "'"; 
    $sql .= $user_Key; 
    $sql .= "';"; 
    $addresses = Address::find_By_Sql($sql); 

    // how many addresses found 
    // if none nothing to do except set focus on address 1 
    // if 1 address returned check active and return xml to complete fields 
    // if >1 return xml to create list for user to select from 

    echo "addr ct:" . count($addresses); 

    if (count($addresses) == 1){ 
     construct_XML($addresses[0]); 
    } 
} else { 
    echo "error nothing passed"; 
} 


function construct_XML($address){ 

    echo ("start xml"); 

    $xml_String = "<?xml vesrion=\"1.0\"?>"; 
    $xml_String .= "<addresses>"; 
    $xml_String .= "<address>"; 
    $xml_String .= "<username>"; 
    $xml_String .= $_POST['username']; 
    $xml_String .= "</username>"; 
    $xml_String .= "<address1>"; 
    $xml_String .= $address->address_1; 
    $xml_String .= "</address1>"; 
    $xml_String .= "<address2>"; 
    $xml_String .= $address->address_2; 
    $xml_String .= "</address2>"; 
    $xml_String .= "<city>"; 
    $xml_String .= $address->city; 
    $xml_String .= "</city>"; 
    $xml_String .= "<county>"; 
    $xml_String .= $address->county; 
    $xml_String .= "</county>"; 
    $xml_String .= "<country>"; 
    $xml_String .= $address->country; 
    $xml_String .= "</country>"; 
    $xml_String .= "<post_Code>"; 
    $xml_String .= $address->post_Code; 
    $xml_String .= "</post_Code>"; 
    $xml_String .= "</address>"; 
    $xml_String .= "</addresses>"; 

    echo $xml_String; 

} 

?> 

設定的地址功能,讀取XML是:

function set_Address(return_Data){ 

$("#address_1").attr("value", $("address1", return_Data).text()); 
$("#address_2").attr("value", $("address2", return_Data).text()); 
$("#city").attr("value", $("city", return_Data).text()); 
$("#county").attr("value", $("county", return_Data).text()); 
$("#country").attr("value", $("country", return_Data).text());   
$("#code").attr("value", $("post_Code", return_Data).text()); 
} 

我在想,我應該返回的文件。 XML而不是回聲字符串,但我不知道如何做到這一點。

任何想法我錯了嗎?我可以簡單地省略數據類型,它一切正常,但我想知道爲什麼它不會識別這個XML,所以我明白了下一次。

非常感謝。

好多謝謝你的回覆。是的,我在原帖中留下了兩個錯誤,它迴應了2條不想要的行。

我現在明白我需要在字符串之前包含頭部,以便讓ajax以XML的形式接受此事。

header ("Content-Type:text/xml");

但是我還是不能讓jQuery來正確地解析從PHP返回的數據都遇到過:

XML解析錯誤沒有的元素中找到位置MOZ-nullprincipal

我一直無法解決這個問題。因此我更新了ajax,以便在另一個套接字中獲取PHP返回XML。我不知道是這是適當的,但它的工作原理:.....

這裏是PHP

<?php require_once("../../_includes/initialize.php"); ?> 


<?php 

/* 
* Accept username from Ajax 
* Get appropriate key 
* Check for pre existing address(es) 
*/ 

$tmpuser = "[email protected]"; 

if(isset($_POST["username"])){ 

    // retrieve user key 

    $sql = "SELECT * FROM User "; 
    $sql .= "WHERE username = "; 
    $sql .= "'"; 
    $sql .= $_POST['username']; 
    $sql .= "'"; 
    $sql .= " LIMIT 1;"; 
    $user = User::find_By_Sql($sql); 
    $user_Key = $user[0]->get_User_Key(); 

    // check for an existing address or addresses 

    $sql = "SELECT * FROM Address "; 
    $sql .= "WHERE user_Key = "; 
    $sql .= "'"; 
    $sql .= $user_Key; 
    $sql .= "';"; 
    $addresses = Address::find_By_Sql($sql); 

    // how many addresses found 
    // if none nothing to do except set focus on address 1 
    // if 1 address returned check active and return xml to complete fields 
    // if >1 return xml to create list for user to select from 

    if (count($addresses) == 1){ 
     construct_XML($addresses[0]); 
    } 
} else { 
    //"error nothing passed"; 
} 


function construct_XML($address){ 

// initialize xml object 

$xml_Data = simplexml_load_string("<?xml version='1.0'?>\n<addresses></addresses>"); 

$address_Detail = $xml_Data->addChild("address"); 
$address_Detail->addChild("username", $_POST['username']); 
$address_Detail->addChild("address1", $address->address_1); 
$address_Detail->addChild("address2", $address->address_2); 
$address_Detail->addChild("city", $address->city); 
$address_Detail->addChild("county", $address->county); 
$address_Detail->addChild("country", $address->country); 
$address_Detail->addChild("post_Code", $address->post_Code); 

$fp = fopen("addresses.xml","wb"); 
fwrite($fp,$xml_Data->asXML()); 
fclose($fp); 

} 

?> 

下面是修改後的Ajax調用:

function check_Address(){ 

$.ajax({ 
    type: "POST", 
    url: "admin_Check_Address.php", 
    data: "username=" + $("#username").attr("value"), 
    success: function(return_Data){ 
      $.ajax({ 
      type: "POST", 
      url: "addresses.xml", 
      dataType: "xml", 
      success: function(xml_Data){ 
       set_Address(xml_Data); 
      }, 
      error: function(){ 
       alert("Could not retrieve XML file."); 
      } 
     }); // end innerajax call 
    }, 
    error: function(){ 
     alert("Could not retrieve XML file."); 
    } 
}); // end ajax call 
} 

的調整SET_ADDRESS功能

function set_Address(xml_Data){ 

$("#address_1").attr("value", $("address1", xml_Data).text()); 
$("#address_2").attr("value", $("address2", xml_Data).text()); 
$("#city").attr("value", $("city", xml_Data).text()); 
$("#county").attr("value", $("county", xml_Data).text()); 
$("#country").attr("value", $("country", xml_Data).text());   
$("#code").attr("value", $("post_Code", xml_Data).text()); 

}

因此,我並不是完全100%地希望能夠在一次命中中完成ajax調用。所以,進一步建議非常歡迎。

+1

第一:你真的需要逃避你輸出的XML結構,以及逃逸你在使用的值的值你的MySQL查詢。其次:您可能想要將內容類型設置爲XML,並刪除您以XML開頭的「開始XML」位。 – MatsLindh 2012-07-16 09:27:41

+0

oops是「開始XML」不應該在那裏。 – codepuppy 2012-07-16 09:30:45

回答

2

您需要在php中設置適當的標題。

header ("Content-Type:text/xml"); 

另外,我已經確定echo(「start xml」);在開始輸出xml之前可能會很麻煩。

+0

好的,得到了​​我已經添加頭上方的回聲ajax現在接受,作爲一個XML文件。現在set_Address不高興 – codepuppy 2012-07-16 09:46:11

+0

沒有看到set_Adress在做什麼,這是不可能的。 – 2012-07-16 09:54:59

+0

對不起@ yan.kun我已經把帖子的set_Address函數,我正在發表聲明,而不是問一個問題。我已經刪除了「開始XML」和「addr ct」,這兩個都意外地留在了。好吧,看着火蟲我看到的答覆和我現在除了現在一樣。但XML報告XML分析錯誤:找不到元素位置:moz-nullprincipal:{8a178f17-a757-461f-b5a6-90fbb85bcca7}行號1,列1:...我正在查看此錯誤。 – codepuppy 2012-07-16 10:04:03

1

可能的是,來自服務器的返回響應的標題與XML不同(可以在firebug中檢查)。

所以你實際發送的是具有html標記的xml(因爲標題是這麼說的)。

如果您明確指出返回的響應是ajax調用中的XML,它將無法解析它。

如果您什麼都不設置,它將能夠讀取HTML,但像DOM元素。

如果設置頁眉正確的,它西港島線propabely固定

header ("Content-Type:text/xml"); 
+0

好的,是的,我已經添加了頭上方的回聲ajax現在接受,作爲一個XML文件。現在set_Address不開心。 – codepuppy 2012-07-16 09:45:58

+0

正如yan.kun所說:) – Nealv 2012-07-16 12:31:27

+0

嚴和@Nealv是的感謝讓我在正確的方向。你將從我的編輯中看到原來的帖子,我不能從PHP獲取xml文件,但只能將它寫入文件並嵌套ajax調用,以便該文件返回。顯然,這不應該是必要。無論我在網上看到什麼,我都有機會找到一個明確的實例。所以我現在正在解決我的2階段方法。 – codepuppy 2012-07-16 12:34:05