Предоставление сгенерированного php XML-файла для анализатора JavaScript

0

Я разрабатываю смарт-ТВ-приложение, которое играет в прямом эфире. Само приложение прекрасно работает, когда я предоставляю ему действительный список воспроизведения xml.

Но когда я использую php для генерации xml файла (который также генерирует штраф), он не работает.

Я получаю сообщение об ошибке:

TypeError: "null" не является объектом (оценивая "this.XHRObj.responseXML.documentElement")

Вот мой php файл, который генерирует videoList.xml, он работает на 100%. Короче говоря, этот скрипт проверяет, есть ли MAC-адрес в базе данных, а если он есть, то он записывает videoList.xml с walid-каналами прямой трансляции. 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

?>

Тогда в приложении samsung smart tv 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 файл?

С уважением, М

  • 0
    Нет, ваш XML создается совершенно неверно. У вас есть <channel> внутри цикла, но только закройте его вне цикла. Вы также закрываете </item> внутри цикла, но никогда не располагаете <item> чтобы открыть этот тег.
  • 0
    Да, вы правы, я исправил, что первый канал в цикле должен был открывать тег элемента. Но результат все тот же: TypeError: 'null' не является объектом (оценка 'this.XHRObj.responseXML.documentElement')
Показать ещё 1 комментарий
Теги:
samsung-smart-tv

1 ответ

0
Лучший ответ

Я понял это, в заголовке php заголовки были неправильными.

Измененный header('Content-Type: application/octet-stream');

в

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

Теперь он работает отлично!

  • 0
    Можете ли вы показать мне, как загрузить XML в плеер? Как изменить графический интерфейс плеера? Я скачал демонстрационное демонстрационное приложение и хочу поучиться у него.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню