我正在尝试在xml文件中使用HTML标记,以后将其用于视图中以显示内容。我的问题是,即使我适当地转义了所有必需的字符,HTML标记仍以纯字符串形式传递。
<?xml version='1.0'?>
<selfassessment>
<topic>
<description>Die <strong> Zweckbestimmung </strong> ist ein eleme
Konsequenzen.</description>
<shortdesc>Zweckbestimmung</shortdesc>
<question>
<questiontext>Ihre fest:</questiontext>
<answer correct="false">Sie habenmung.</answer>
<answer correct="true"> erreichen sollen.</answer>
<answer correct="true">Das phyiert.</answer>
<answer correct="true">Die Chlektuellen eiten.</answer>
<answer correct="true">Die Beler "Workload".</answer>
<answer correct="true">Date.</answer>
<comment>All <br/><a href="/someLink" class="button">Erfahren Sie hier mehr</a></comment>
</question>
</topic>
</selfassessment>
显示时,它不会实现html标签,而是将它们粘贴到纯字符串中。
我看过这里所有相关的问题,我尝试使用CDATA,但没有成功。我在这里缺少什么吗?它应该像这样工作吗?
谢谢。
编辑:(涉及php代码)
获取xml文件:
function getXmlFile(){
$xml = null;
$xmlFile = '/var/www/html/typo3conf/ext/extKeyHere/Resources/Private/XML/data.xml';
if (file_exists($xmlFile)) {
$xml = simplexml_load_file($xmlFile);
} else {
exit("Datei $xmlFile kann nicht geöffnet werden.");
//echo "Datei $xmlFile kann nicht geöffnet werden.";
}
return $xml;
}
后来我像这样使用它:
function __construct($xmldata) {
$this->xml = $xmldata;
$this->calculateResults();
}
private function calculateResults() {
$page = 0;
//iterating over xml file
foreach ($this->xml->topic as $thema) {
$this->topics[$page] = $thema->description;
and so on.....
//passing it to the view
$this->view->assignMultiple(array(
'allQuestions' => $allQuestions,
'questions' => $questions,
....
视图内的代码:
<form method='post' action="{url}">
<h3>{allQuestions.themaDescr}</h3>
<f:for each="{allQuestions.thema.question}" as="question" iteration="i">
<div class='question'><p><strong>Frage {i.cycle}</strong>:
{question.questiontext}</p>
<f:for each="{question.answer}" as="answer" iteration="ii">
<div class='answer'><input type='checkbox' name='A{page}
{i.cycle}{ii.cycle}'/>
<div class='subanswer' for='A{page}{i.cycle}{ii.cycle}'>
{answer}
</div>
</div>
</f:for>
</div>
</f:for>
<input type='hidden' name='page' value='{allQuestions.page}'/>
<f:if condition="{allQuestions.nextThema}">
<f:then>
<button type='submit'>Ergebnisse anzeigen</button>
</f:then>
<f:else>`
<button type='submit'>Nächste Seite</button>
</f:else>
</f:if>
</form>
没有错误,除了我提到的html标记显示为纯文本之外,其他所有功能都正常运行。 顺便说一句,这是Typo3,但我认为除了将数据传递到视图并显示数据外,其他都没有关系。
答案 0 :(得分:1)
目前尚不清楚您的问题是什么,目标是什么。
让我尝试一些帮助您的事情。
第一件事-您有数据:
<description>Die <strong> Zweckbestimmung </strong> ist ein eleme Konsequenzen.</description>
<comment>All <br/><a href="/someLink" class="button">Erfahren Sie hier mehr</a></comment>
该数据部分具有html编码字符。关键是永远不要将数据与真实的html或xml混合。
因此,当您这样做时:
$this->topics[$page] = $thema->description;
您的值仍包含html编码字符:
$this->topics[$page] === `Die <strong> Zweckbestimmung </strong> ist ein eleme Konsequenzen.`
从您的角度来看,这可能是种错误。但是对我来说,目前还没有发现任何问题。
然后您这样做:
<div class='question'><p><strong>Frage {i.cycle}</strong>:
{question.questiontext}</p>
让我们简化并仅关注此部分:
<p>{question.questiontext}</p>
在数据xml中不清楚的一件事是没有名称为questiontext
的字段。因此,假设为topic->question->comment
。
您的价值意味着:
<p>All <br/><a href="/someLink" class="button">Erfahren Sie hier mehr</a></p>
您可能不希望得到这样的东西,您对此并不高兴:
<p>All <br/><a href="/someLink" class="button">Erfahren Sie hier mehr</a></p>
危险,如果您使用htmlspecialchars_decode
函数将html实体解码回未编码的字符,则可以这样做:
// or whatever part you have to get comment
$this->topics[$page]['topic']['question']['comment'] = htmlspecialchars_decode($thema->question->comment);
这应该可以按您期望的方式工作。但这是非常危险的。当您允许数据包含html未编码部分时,您可以打开xss