Как добавить и изменить теги XML в PHP

Мне нужна ваша помощь, я работаю над своим PHP-скриптом для создания документа XML с кодировкой utf8, чтобы я мог сгенерировать XML-файл, чтобы я мог сохранить XML-файл в своем веб-хосте.

Я хочу сделать вывод xml примерно таким:

<?xml version="1.0" encoding="UTF-8" ?> <tv generator-info-name="www.mysite.com/xmltv"> <channel id=""> <display-name>Information from database</display-name> <programme channel="Information from database" start="" stop=""> <title lang="en"></title> <sub-title lang="en"> </sub-title> <desc lang="en"></desc> <category lang="en"></category> </programme> </channel> 

Вот как выглядит мой XML-вывод:

 <?xml version="1.0" encoding="UTF-8"?> <tv generator-info-name="www.mysite.com/xmltv"><channel><display-name>Information from database</display-name><programme/><desc/></channel></tv> 

Вот текущий код:

 <?php function db_connect() { define('DB_HOST', 'localhost'); define('DB_USER', 'myusername'); define('DB_PASSWORD', 'mypassword'); define('DB_DATABASE', 'mydbname'); $errmsg_arr = array(); $errflag = false; $link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD); if(!$link) { die('Failed to connect to server: ' . mysql_error()); } $db = mysql_select_db(DB_DATABASE); if(!$db) { die("Unable to select database"); } } db_connect(); function clean($var) { return mysql_real_escape_string(strip_tags($var)); } $channels = clean($_GET['channels']); $id = clean($_GET['id']); if($errflag) { $_SESSION['ERRMSG_ARR'] = $errmsg_arr; echo implode('<br />',$errmsg_arr); } else { $insert = array(); if(isset($_GET['channels'])) { $insert[] = 'channels = \'' . clean($_GET['channels']) .'\''; } if(isset($_GET['id'])) { $insert[] = 'id = \'' . clean($_GET['id']) . '\''; } if($channels && $id) { $qrytable1="SELECT id, channels, links FROM tvguide WHERE channels='$channels' && id='$id'"; $result1=mysql_query($qrytable1) or die('Error:<br />' . $qry . '<br />' . mysql_error()); echo '<?xml version="1.0" encoding="UTF-8" ?> <tv generator-info-name="www.mysite.com/xmltv"> <channel id=""> <display-name></display-name> <programme channel="" start="" stop=""> <title lang="en"></title> <sub-title lang="en"></sub-title> <desc lang="en"></desc> <category lang="en"></category> </programme> </channel> </tv>'; while ($row = mysql_fetch_array($result1)) { } mysql_close(); } else if(!$channels && ! $id) { $qrytable1="SELECT id, channels, links, streams FROM tvguide"; $result1=mysql_query($qrytable1) or die('Error:<br />' . $qry . '<br />' . mysql_error()); while ($row = mysql_fetch_array($result1)) { } mysql_close(); } } // create a dom document with encoding utf8 $domtree = new DOMDocument('1.0', 'UTF-8'); // create a root element of the xml tree $tv = $domtree->createElement('tv'); //create attributes for element $generator_info_name = $domtree->createAttribute('generator-info-name'); $generator_info_name->value = 'mysite.com/xmltv'; //append attribute $tv->appendChild($generator_info_name); // append element to the doc $tv = $domtree->appendChild($tv); //add a channel as a child of the root $channel = $domtree->createElement('channel'); $channel_id = $domtree->createAttribute('id'); $channel_id->value = '""'; $channel = $tv->appendChild($channel); //append children to channel $channel->appendChild($domtree->createElement('display-name','Information from database')); $channel->appendChild($domtree->createElement("programme")); $channel->appendChild($domtree->createElement('desc')); //finally, save the file echo $domtree->saveXML(); $domtree->save('myChannel.xml'); ?> 

Вы знаете, как я могу сделать тот же вывод XML, что и первый код?

И как я могу выводить для каждой информации из базы данных mysql, чтобы поместить ее в каждый тег канала, и я хочу добавить теги под тегом канала, включая названия отображаемых имен, программных каналов, заголовков, подзаголовков, дескрипторов и категорий, когда Я выводю для каждого из данных из mysql?

Edit: Когда я попробую это, он не получит строки из базы данных mysql, чтобы поместить данные в каждый channel тега xml с другими display-name тегов, programme-channel , title , sub-title , desc и category .

Вот источник:

 <?php function db_connect() { define('DB_HOST', 'localhost'); define('DB_USER', 'mybox123'); define('DB_PASSWORD', 'f00tball'); define('DB_DATABASE', 'mybox123_tvguide'); $errmsg_arr = array(); $errflag = false; $link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD); if(!$link) { die('Failed to connect to server: ' . mysql_error()); } $db = mysql_select_db(DB_DATABASE); if(!$db) { die("Unable to select database"); } } db_connect(); function clean($var) { return mysql_real_escape_string(strip_tags($var)); } $channels = clean($_GET['channels']); $id = clean($_GET['id']); if($errflag) { $_SESSION['ERRMSG_ARR'] = $errmsg_arr; echo implode('<br />',$errmsg_arr); } else { $insert = array(); if(isset($_GET['channels'])) { $insert[] = 'channels = \'' . clean($_GET['channels']) .'\''; } if(isset($_GET['id'])) { $insert[] = 'id = \'' . clean($_GET['id']) . '\''; } if($channels && $id) { $qrytable1="SELECT id, channels, links FROM tvguide WHERE channels='$channels' && id='$id'"; $result1=mysql_query($qrytable1) or die('Error:<br />' . $qry . '<br />' . mysql_error()); while ($row = mysql_fetch_array($result1)) { } mysql_close(); } else if(!$channels && ! $id) { $qrytable1="SELECT id, channels, links, streams FROM tvguide"; $result1=mysql_query($qrytable1) or die('Error:<br />' . $qry . '<br />' . mysql_error()); $xml = '<?xml version="1.0" encoding="utf-8"?> <tv generator-info-name="www.mysite.com/xmltv"></tv>'; $my_xml = new SimpleXMLElement($xml); while ($row = mysql_fetch_array($result1)) { foreach($row as $rows) { $channel = $my_xml->addChild('channel'); $channel->addAttribute('id', ''); $channel->addChild('display-name', $row['channel']); $programme = $channel->addChild('programme'); $programme->addAttribute('channel', $row['channel']); $programme->addAttribute('start', $row['start']); $programme->addAttribute('stop', $row['stop']); $title = $programme->addChild('title', $row['title']); $title->addAttribute('lang', 'en'); $sub_title = $programme->addChild('sub-title', $row['subtitle']); $sub_title->addAttribute('lang', 'en'); $desc = $programme->addChild('desc', $row['desc']); $desc->addAttribute('lang', 'en'); $category = $programme->addChild('category', $row['category']); $category->addAttribute('lang', 'en'); } } mysql_close(); } } // create a dom document with encoding utf8 $domtree = new DOMDocument($my_xml); //finally, save the file echo $domtree->saveXML(); $domtree->save('myChannel.xml'); ?> 

Вот результат xml:

 <?xml version=""?> 

Из вашего кода:

 while ($row = mysql_fetch_array($result1)) 

Вы должны иметь возможность получить массив со следующей информацией (или что-то похожее):

 $rows = array( array( 'channel' => 'channel1', 'start' => 'start1', 'stop' => 'stop1', 'title' => 'title1', 'subtitle' => 'subtitle1', 'desc' => 'desc1', 'category' => 'category1' ), array( 'channel' => 'channel2', 'start' => 'start2', 'stop' => 'stop2', 'title' => 'title2', 'subtitle' => 'subtitle2', 'desc' => 'desc2', 'category' => 'category2' ), ); 

Для получения XML я обычно использую SimpleXMLElement. Пример ниже, как я получаю следующую структуру:

 <?xml version="1.0" encoding="utf-8"?> <tv generator-info-name="www.mysite.com/xmltv"> <channel id=""> <display-name>channel1</display-name> <programme channel="channel1" start="start1" stop="stop1"> <title lang="en">title1</title> <sub-title lang="en">subtitle1</sub-title> <desc lang="en">desc1</desc> <category lang="en">category1</category> </programme> </channel> <channel id=""> <display-name>channel2</display-name> <programme channel="channel2" start="start2" stop="stop2"> <title lang="en">title2</title> <sub-title lang="en">subtitle2</sub-title> <desc lang="en">desc2</desc> <category lang="en">category2</category> </programme> </channel> 

 <?php $xml = <<<XML <?xml version="1.0" encoding="utf-8"?><tv generator-info-name="www.mysite.com/xmltv"></tv> XML; $my_xml = new SimpleXMLElement($xml); foreach($rows as $row) { $channel = $my_xml->addChild('channel'); $channel->addAttribute('id', ''); $channel->addChild('display-name', $row['channel']); $programme = $channel->addChild('programme'); $programme->addAttribute('channel', $row['channel']); $programme->addAttribute('start', $row['start']); $programme->addAttribute('stop', $row['stop']); $title = $programme->addChild('title', $row['title']); $title->addAttribute('lang', 'en'); $sub_title = $programme->addChild('sub-title', $row['subtitle']); $sub_title->addAttribute('lang', 'en'); $desc = $programme->addChild('desc', $row['desc']); $desc->addAttribute('lang', 'en'); $category = $programme->addChild('category', $row['category']); $category->addAttribute('lang', 'en'); } print_r($my_xml->asXML());