在XML文件中使用HTML标记,以后将它们显示/识别为HTML

时间:2018-10-31 12:43:49

标签: php html xml

我正在尝试在xml文件中使用HTML标记,以后将其用于视图中以显示内容。我的问题是,即使我适当地转义了所有必需的字符,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,但我认为除了将数据传递到视图并显示数据外,其他都没有关系。

1 个答案:

答案 0 :(得分: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>

危险,如果您使用htmlspecialchars_decode函数将html实体解码回未编码的字符,则可以这样做:

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

这应该可以按您期望的方式工作。但这是非常危险的。当您允许数据​​包含html未编码部分时,您可以打开xss