2012-07-16 83 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