2014-04-29 126 views
0

我想用JavaScript來解析由PHP腳本返回的XML文件,但有什麼不工作,我不知道是什麼。 的PHP是這樣的:的Javascript XML解析錯誤

<?php 
    header("Content-Type: text/xml"); 
    include ('database_connection.php'); 

    // Start XML file, create parent node 
    $dom = new DOMDocument("1.0"); 
    $node = $dom->createElement("elements"); 
    $parnode = $dom->appendChild($node); 


    $category = $_GET['category']; 
    $city = $_GET['city']; 
    $country = $_GET['country']; 

    $query = "select * from elements where elementId=any(select elementId from citycategoryelements where cityId=" 
      . "any(select cityId from city where name='$city' and country='$country') and categoryId=any(" 
      . "select categoryId from categories where name='$category'))"; 

    $result = mysqli_query($dbc, $query); 

    if (!$result) { 
     echo "Could not successfully run query from DB: " . mysql_error(); 
     exit; 
    } 

    // Iterate through the rows, adding XML nodes for each 
    while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) { 
     // Add to XML document node 
     $node = $dom->createElement("element"); 
     $newnode = $parnode->appendChild($node); 
     $newnode->setAttribute("name", $row['name']); 
     $newnode->setAttribute("address", $row['address']); 
    } 
    echo $dom->saveXML(); 
    ?> 

返回的XML看起來是這樣的: XML實例

<?xml version="1.0"?> 
<elements> 
    <element name="first_name" address="first_address"/> 
    <element name="second_name" address="second_address"/> 
</elements> 

然後我嘗試處理與Java語言的XML文件:

var xmlhttp; 
if (window.XMLHttpRequest) 
{// code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp = new XMLHttpRequest(); 
} 
else 
{// code for IE6, IE5 
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
} 

xmlhttp.onreadystatechange = function() 
{ 
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) 
    { 
     var xmlDoc = xmlhttp.responseXML; 
     var name = xmlDoc.getElementsByTagName("element")[0].getAttribute("name"); 
     alert(name); 
    } 
} 
xmlhttp.open("GET", "getElements.php?category=" + encodeURIComponent(category) + 
       "&city=" + encodeURIComponent(address[0]) 
       + "&country=" + encodeURIComponent(address[1]), true); 
       //xmlhttp.open("get", "file.xml", true); 
       xmlhttp.send(); 
} 

當我嘗試運行代碼時,警告不會出現。此外,如果我嘗試提醒xmlDoc我得到null

你可以看到,我有這樣的評論//xmlhttp.open("get", "file.xml", true)

如果我使用它,而不是 第一xmlthttp.open它的工作原理(你可能猜到了file.xml只是一個簡單的XML文件,它看起來像上面的例子) 。我真的不知道問題可能出在哪裏,我相信PHP腳本會返回一個有效的XML文件。如果有人能幫助我,那就太好了,謝謝!

編輯

還我忘了說了,如果我使用Firebug和

我得到的是這樣的:

TypeError: xmlDoc.getElementsByTagName(...)[0] is undefined

+0

順便說一句,你應該非常小心的SQL注入。除非這是某種內部或測試應用。 – Swippen

+1

你可以嘗試登錄'xmlDoc'的內容在回調函數,僅僅是'VAR xmlDoc中後= xmlhttp.responseXML;'行' –

+0

的console.log(XMLHTTP);'您能得到什麼?此外,也許這將是一個更容易發出JSON而不是XML – Steve

回答

0

TypeError: xmlDoc.getElementsByTagName(...)[0] is undefined

這意味着xmlDoc定義,因爲它可能會調用getElementsByTagName,但從getElementsByTagName返回沒有公司路得屬性0,這意味着getAttribute失敗,因爲x[0]不確定

這表明你的XML因爲你沒有按預期分析;如您所示輸出生成<element>標籤。

審查控制檯中的xmlDoc,你應該能夠看到一個錯誤信息出現。


這麼說,我不能重現你的錯誤

var xhr, b, uri; 
xhr = new XMLHttpRequest; 
xhr.onload = function() { 
    URL.revokeObjectURL(uri); 
    console.log(this.responseXML); 
}; 

b = new Blob(['<?xml version="1.0"?>\n\ 
<elements>\n\ 
    <element name="first_name" address="first_address"/>\n\ 
    <element name="second_name" address="second_address"/>\n\ 
</elements>'], {type: 'text/xml'}); 
uri = URL.createObjectURL(b); 

xhr.open('GET', uri); 
xhr.send(); 
+0

@fifth - 請確保你找到你的瀏覽器的控制檯,並要求你提供說明。 alert()是一個相當有限的調試工具。 –

+0

@Paul S - 謝謝你的幫助,它是XML解析的問題,一開始它有2個空格,所以它是無效的。再次感謝,也感謝大家試圖幫助我,給我有用的建議! – fifth