Добавить HTML-коды в XML-файл с помощью PHP

У меня есть xml-файл (scores.xml), который im использует php-коды для добавления в него новых тегов …

У меня есть тег Header, который содержит некоторый html-код

<![CDATA[<tr><td colspan='7' id='headertd'> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img border='0' src='images/euro.png' /> &nbsp;&nbsp;&nbsp;&nbsp; UEFA Euro 2012 Qualifications</td></tr>]]> 

когда im, пишущий этот код в виде скрипта pgp и отправляя все, идет нормально в XML-файл, кроме тега заголовка …. im получает ошибку в php-скрипте, а код идет в теге xml:

 &lt;![CDATA[&lt;tr&gt;&lt;td colspan='7' id='headertd'&gt;
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 &lt;img border='0' src='images/euro.png' /&gt;
 &nbsp;&nbsp;&nbsp;&nbsp;
 UEFA Euro 2012 Qualifications&lt;/td&gt;&lt;/tr&gt;]]&gt; 

так что я получаю длинную информацию для моего xml … есть ли в любом случае я могу это исправить? и избегать трансформации этих кодов?

thats my php code:

 <?php if (isset($_POST['submitted'])) {//If the user submitted the form, then add to the XML file //Load the scores XML file $scores = new DOMDocument(); $scores -> load('../scores.xml'); //Get the <Games> tag $games = $scores -> getElementsByTagName('Games'); //Create the new <Game> tag (Could probably be done better by first placing everything in an array or something) $newGame = $scores -> createElement("Game"); $newGame -> appendChild($scores -> createElement("Header", $_POST['header'])); $newGame -> appendChild($scores -> createElement("Row", $_POST['row'])); $newGame -> appendChild($scores -> createElement("Date", $_POST['date'])); $newGame -> appendChild($scores -> createElement("Time", $_POST['time'])); $newGame -> appendChild($scores -> createElement("HomeTeam", $_POST['hometeam'])); $newGame -> appendChild($scores -> createElement("Score", $_POST['score'])); $newGame -> appendChild($scores -> createElement("AwayTeam", $_POST['awayteam'])); $newGame -> appendChild($scores -> createElement("Other", $_POST['other'])); $newGame -> appendChild($scores -> createElement("InfoID", $_POST['infoid'])); $newGame -> appendChild($scores -> createElement("InfoData", $_POST['infodata'])); //Add the new <Game> tag under the <Games> tag $games -> item(0) -> appendChild($newGame); //Save again $scores -> save('../scores.xml'); echo "New game added."; } ?> 

и этот php связан с формой, которая выглядит так:

 <form id="form1" method="post" action=""> <table id="table2"> <tr><td>Header:</td> <td><textarea style=" color:#000;" name="header" cols="73" rows="6" > </textarea></td></tr> <tr><td>Row:</td> <td><input id='textfield' type="text" size="70" name="row" value='A or B' onfocus="inputFocus(this)" onblur="inputBlur(this)"></td></tr> <tr><td>Date:</td> <td><input id='textfield' type="text" size="70" name="date" value='Date and time of the match' onfocus="inputFocus(this)" onblur="inputBlur(this)"></td></tr> <tr><td>Time:</td> <td><input id='textfield' type="text" size="70" name="time" value='Current time' onfocus="inputFocus(this)" onblur="inputBlur(this)"></td></tr> <tr><td>HomeTeam:</td> <td><input id='textfield' type="text" size="70" name="hometeam" value='Home Team' onfocus="inputFocus(this)" onblur="inputBlur(this)"></td></tr> <tr><td>Score:</td> <td><input id='textfield' type="text" size="70" name="score" value='Score' onfocus="inputFocus(this)" onblur="inputBlur(this)"></td><td>"3 - 2"</td></tr> <tr><td>AwayTeam:</td> <td><input id='textfield' type="text" size="70" name="awayteam" value='Away Team' onfocus="inputFocus(this)" onblur="inputBlur(this)"></td></tr> <tr><td>Other:</td> <td><input id='textfield' type="text" size="70" name="other" value='Additional Info' onfocus="inputFocus(this)" onblur="inputBlur(this)"></td></tr> <tr><td>InfoID:</td> <td><input id='textfield' type="text" size="70" name="infoid" value='The ID of the Popup' onfocus="inputFocus(this)" onblur="inputBlur(this)" ></td><td></td></tr> <tr><td>InfoData:</td> <td><textarea id='textfield' value='Data of the Popup' onfocus="inputFocus(this)" onblur="inputBlur(this)" name="infodata" cols="73" rows="6"></textarea></td><td> <tr><td> </td><td><input type="submit" name="submitted" name="Add new row"></td><td> <td></td> </table> <style> BODY {font-family:"Trebuchet MS", Arial, Helvetica, sans-serif; color:#333; font-size:11px;} #textfield {color:#888;} #table2 td, tr { padding-right:10px;} </style> 

Вы можете использовать функцию createCDATASection PHP, чтобы добавить CDATA в ваш XML-файл:

обмен

 $newGame -> appendChild($scores -> createElement("Header", $_POST['header'])); 

для

 $h = $scores -> createElement("Header"); //Create a empty <Header> tag $h -> appendChild($scores ->createCDATASection ($_POST['header'])); //Add a CDATA element to it $newGame -> appendChild($h); //Then append it to the game tag 

С комментариями это должно быть довольно прямолинейно.

Я думаю, вы просто не должны использовать CDATA. С этим связано множество проблем; Оставляя это, я считаю, что все будет работать так, как ожидалось.

То, что у вас сейчас есть, – это двойное кодирование (с использованием CDATA и добавленных объектов), поэтому в этом случае результат будет неправильным.

Код, стоящий за формой, вероятно, сохраняет значения формы, используя что-то вроде:

 htmlentities($xml_string); 

Если вы используете фреймворк для обработки формы, возможно, что существует флаг, который может быть передан (True / False), чтобы сообщить структуре НЕ использовать htmlentities при сохранении данных. Тем не менее, убедитесь, что вы все еще проверяете поле в некотором роде, чтобы предотвратить отверстия для защиты от инъекций. (Например, если хранение в БД использует mysql_real_escape_string () или подобное.)

Вы можете попробовать:

 $scores = new DOMDocument(); $scores->substituteEntities = false; $scores->load('../scores.xml'); 

Я просто хотел бы, чтобы это выглядело так в файле xml, и когда вы его htmlspecialchars_decode вы бы использовали функцию PHP htmlspecialchars_decode для их преобразования.

Пример:

 <?php $s = "&lt;tr&gt;&lt;td colspan='7' id='headertd'&gt;&#xD; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#xD; &lt;img border='0' src='images/euro.png' /&gt;&#xD; &nbsp;&nbsp;&nbsp;&nbsp;&#xD; UEFA Euro 2012 Qualifications&lt;/td&gt;&lt;/tr&gt;"; //The orginal $s is retrieved from the XML file $s = htmlspecialchars_decode($s); echo $s; //The orginal code is printed ?>