将php生成的xml文件提供给javascript解析器

时间:2015-01-06 15:03:35

标签: javascript php xml samsung-smart-tv

我正在开发一个可以播放直播的智能电视应用。当我向它提供有效的xml播放列表时,应用程序本身工作正常。

但是当我使用php生成xml文件(也生成很好)时,它不起作用。

我收到错误:

  

TypeError:'null'不是对象(评估'this.XHRObj.responseXML.documentElement')

这是我的php文件生成videoList.xml,它100%工作。 简而言之,此脚本会检查数据库中的MAC地址是否存在,如果是,则会使用walid实时流式链接写入videoList.xml。 的 SamsungAPI.php

<?php
$MAC = $_GET['MAC'];
require_once('../config.php'); 
//Remove brackets form array
$_INFO = preg_replace('/[{}]/', '', $_INFO);
$mysqli = new mysqli($_INFO['host'], $_INFO['db_user'], $_INFO['db_pass'], $_INFO['db_name']);
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
$sql="SELECT * FROM users WHERE admin_notes = '$MAC' ";
$rs=$mysqli->query($sql);
$rows=mysqli_num_rows($rs);
if ($rows == 1) {
    //MAC FOUND
    $row = mysqli_fetch_array($rs);
    $username = $row['username'];
    $password = $row['password'];
    $file = "videoList.xml";
         $txt_file = file_get_contents('http://' . $_SERVER['HTTP_HOST'] . '/get.php?type=starlivev3&username=' . $username . '&password=' . $password . '&output=hls');
           $rows        = explode("\n", $txt_file);
              if(empty($rows[count($rows)-1])) {
                 unset($rows[count($rows)-1]);
                 $rows=array_map('trim',$rows);
              }
       $handle = fopen($file, "w+") or die('Could not open file');
       fwrite($handle, "<?xml version=\"1.0\"?>"."\n");
       fwrite($handle, "<rss version=\"2.0\">"."\n");
       fwrite($handle, "<channel>"."\n");
  foreach($rows as $row => $data)
       {
    //get row data
    $row_data = explode(',', $data);
    //replace _ with spaces
    $row_data[0] = str_replace('_', ' ', $row_data[0]);


       //generate playlist content
       fwrite($handle, "<item>"."\n");
       fwrite($handle, "<title>{$row_data[0]}</title>"."\n");
       fwrite($handle, "<link>{$row_data[1]}</link>"."\n");
       fwrite($handle, "<description> Reserved for EPG </description>"."\n");
       fwrite($handle, "</item>"."\n");
     }
fwrite($handle, "</channel>"."\n");
fwrite($handle, "</rss>");
fclose($handle);
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
    exit;

} else {
//MAC NOT FOUND
echo "MAC NOT FOUND";
}
mysqli_close($mysqli); // Closing Connection

?>

然后在三星智能电视videoplayer应用程序中,我有这样的xml解析器:

Server.js

var Server =
{
    /* Callback function to be set by client */
    dataReceivedCallback : null,

    XHRObj : null,
    url : "http://myvalidhost.com/samsungAPI.php?MAC=02000027000b"
}

Server.init = function()
{
    var success = true;

    if (this.XHRObj)
    {
        this.XHRObj.destroy();  // Save memory
        this.XHRObj = null;
    }

    return success;
}

Server.fetchVideoList = function()
{
    if (this.XHRObj == null)
    {
        this.XHRObj = new XMLHttpRequest();
    }

    if (this.XHRObj)
    {
        this.XHRObj.onreadystatechange = function()
            {
                if (Server.XHRObj.readyState == 4)
                {
                    Server.createVideoList();
                }
            }

        this.XHRObj.open("GET", this.url, true);
        this.XHRObj.send(null);
     }
    else
    {
        alert("Failed to create XHR");
    }
}

Server.createVideoList = function()
{
    if (this.XHRObj.status != 200)
    {
        Display.status("XML Server Error " + this.XHRObj.status);
    }
    else
    {
        var xmlElement = this.XHRObj.responseXML.documentElement;

        if (!xmlElement)
        {
            alert("Failed to get valid XML");
        }
        else
        {
            // Parse RSS
            // Get all "item" elements
            var items = xmlElement.getElementsByTagName("item");

            var videoNames = [ ];
            var videoURLs = [ ];
            var videoDescriptions = [ ];

            for (var index = 0; index < items.length; index++)
            {
                var titleElement = items[index].getElementsByTagName("title")[0];
                var descriptionElement = items[index].getElementsByTagName("description")[0];
                var linkElement = items[index].getElementsByTagName("link")[0];
                if (titleElement && descriptionElement && linkElement)
                {
                    videoNames[index] = titleElement.firstChild.data;

                    if(linkElement.firstChild.data.substring(0,4) !="http"){
                        alert("asdasdasd  "+linkElement.firstChild.data.substring(0,4));
                        var rootPath = window.location.href.substring(0, location.href.lastIndexOf("/")+1);
                        var Abs_path = unescape(rootPath).split("file://")[1]+linkElement.firstChild.data;
                        videoURLs[index] = Abs_path;        
                    }
                    else{
                        videoURLs[index] = linkElement.firstChild.data;                         
                    }
                    videoDescriptions[index] = descriptionElement.firstChild.data;
                }
            }

            Data.setVideoNames(videoNames);
            Data.setVideoURLs(videoURLs);
            Data.setVideoDescriptions(videoDescriptions);

            if (this.dataReceivedCallback)
            {
                this.dataReceivedCallback();    /* Notify all data is received and stored */
            }
        }
    }
}

有没有人知道为什么它不接受我生成的xml文件?

此致 中号

1 个答案:

答案 0 :(得分:0)

我想通了,在php标题内容类型错误。

header('Content-Type: application/octet-stream');

header('Content-Type: application/xml');

现在它完美无缺!