Использовать html-теги в xml-файле и отображать / распознавать их позже как html

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

<?xml version='1.0'?>  
    <selfassessment>
        <topic>
            <description>Die &lt;strong&gt; Zweckbestimmung &lt;/strong&gt; 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 &quot;Workload&quot;.</answer>
                <answer correct="true">Date.</answer>
                <comment>All  &lt;br/&gt;&lt;a href=&quot;/someLink&quot; class=&quot;button&quot;&gt;Erfahren Sie hier mehr&lt;/a&gt;</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, но я не думаю, что это имеет значение, за исключением того, как я передаю данные в представление и отображаю их.

Я не вижу CDATA в этом коде

brombeer 31.10.2018 13:47

Вы можете получить пример по URL: stackoverflow.com/questions/4412395/…

Vishal 31.10.2018 13:53

@kerbholz, может быть, я недостаточно ясно понял. Я также пробовал использовать CDATA, но это не сработало. Но я подумал, что после выхода из символов тега html он все равно должен работать.

dombg 31.10.2018 14:33

@Vish Я прочитал именно этот вопрос, но у меня он не сработал. В разделе CDATA теги HTML также не распознавались и заканчивались как обычная строка или полностью игнорировались

dombg 31.10.2018 14:33

Как вы извлекаете HTML из XML и отображаете его? Это решающая часть.

BoltClock 31.10.2018 14:51

@BoltClock Что вы имеете в виду под распаковкой? Я просто использую XML-файл в качестве источника данных. Я не извлекаю HTML из XML. Не могли бы вы объяснить, что вы имеете в виду? Я использую php-функцию simplexml_load_file для загрузки xml, а затем просто перебираю объект simplexml.

dombg 02.11.2018 12:40

Да, это то, что я имел в виду, извините. Можете ли вы добавить свой PHP-код к своему вопросу?

BoltClock 02.11.2018 12:50

@BoltClock Я отредактировал свой пост. Спасибо за вашу помощь.

dombg 02.11.2018 15:09

где ваш выходной фрагмент кода?

Alex 02.11.2018 15:13

Пока HTML находится в экранированной форме (с использованием сущностей), он никогда не будет интерпретирован как HTML - в этом заключается идея экранирования.

Dormilich 02.11.2018 15:31

@Alex Я добавил код для представления.

dombg 06.11.2018 08:54

@Dormilich Это правда, но каково ваше решение?

dombg 06.11.2018 09:05
php.net/htmlspecialchars-decode
Dormilich 06.11.2018 14:03
1
13
874
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

До сих пор не ясно, в чем ваша проблема и какова ваша цель.

Позвольте мне попытаться вам помочь.

Во-первых, у вас есть данные:

<description>Die &lt;strong&gt; Zweckbestimmung &lt;/strong&gt; ist ein eleme Konsequenzen.</description>
<comment>All  &lt;br/&gt;&lt;a href=&quot;/someLink&quot; class=&quot;button&quot;&gt;Erfahren Sie hier mehr&lt;/a&gt;</comment>

Эта часть данных содержит символы в кодировке HTML. Дело в том, чтобы никогда не смешивать данные с реальным HTML или XML.

Итак, когда вы это сделаете:

$this->topics[$page] = $thema->description;

ваше значение все еще содержит символы в кодировке html:

$this->topics[$page] === `Die &lt;strong&gt; Zweckbestimmung &lt;/strong&gt; 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  &lt;br/&gt;&lt;a href=&quot;/someLink&quot; class=&quot;button&quot;&gt;Erfahren Sie hier mehr&lt;/a&gt;</p>

И вы не счастливы от этого, вероятно, вы ожидаете получить:

<p>All <br/><a href="/someLink" class="button">Erfahren Sie hier mehr</a></p>

ОПАСНОСТЬ Вы можете сделать это, если декодируете объекты html обратно в незакодированные символы с помощью функции htmlspecialchars_decode, например:

// or whatever part you have to get comment
$this->topics[$page]['topic']['question']['comment'] = htmlspecialchars_decode($thema->question->comment);

Это должно работать так, как вы ожидаете. Но это очень опасно. Когда вы позволяете данным содержать незакодированные части HTML, вы открыты для xss

Спасибо за помощь, разобрался благодаря вам. Но я сделал это с помощью метода viewhelpers f: format.htmlentitiesDecode. Теперь теги HTML распознаются как HTML, а не как обычный текст.

dombg 06.11.2018 16:38

Другие вопросы по теме