У меня есть xml-файл (scores.xml), который im использует php-коды для добавления в него новых тегов …
У меня есть тег Header, который содержит некоторый html-код
<![CDATA[<tr><td colspan='7' id='headertd'> <img border='0' src='images/euro.png' /> UEFA Euro 2012 Qualifications</td></tr>]]>
когда im, пишущий этот код в виде скрипта pgp и отправляя все, идет нормально в XML-файл, кроме тега заголовка …. im получает ошибку в php-скрипте, а код идет в теге xml:
<![CDATA[<tr><td colspan='7' id='headertd'>
<img border='0' src='images/euro.png' />
UEFA Euro 2012 Qualifications</td></tr>]]>
так что я получаю длинную информацию для моего 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 = "<tr><td colspan='7' id='headertd'>
 
 <img border='0' src='images/euro.png' />
 
 UEFA Euro 2012 Qualifications</td></tr>"; //The orginal $s is retrieved from the XML file $s = htmlspecialchars_decode($s); echo $s; //The orginal code is printed ?>