2015-08-31 5 views
0

Мне нужно сгенерировать XML-файл с использованием PHP, имеющего следующую структуру. Этот файл представляет собой структуру викторины, в которой каждый вопрос имеет пять ответов. Тексты вопросов и ответов прилагаются в CDATA.Сгенерировать XML-файл с помощью PHP

<?xml version="1.0" encoding="UTF-8"?> 
<QuizMaster> 
<header version="0.36" exportVersion="1" /> 
    <data> 
     <quiz> 
      <autostart>false</autostart> 
      <forms activated="false" position="0" /> 
      <questions> 
       <question answerType="single"> 
        <questionText><![CDATA[What is the city?]]></questionText> 
        <correctMsg /> 
        <incorrectMsg /> 
        <answers> 
         <answer points="1" correct="true"> 
          <answerText html="false"><![CDATA[Kolkata]]></answerText> 
         </answer> 
         <answer points="1" correct="false"> 
          <answerText html="false"><![CDATA[Delhi]]></answerText> 
         </answer> 
         <answer points="1" correct="false"> 
          <answerText html="false"><![CDATA[Mumbai]]></answerText> 
         </answer> 
         <answer points="1" correct="false"> 
          <answerText html="false"><![CDATA[Chennai]]></answerText> 
         </answer> 
         <answer points="1" correct="false"> 
          <answerText html="false"><![CDATA[Goa]]></answerText> 
         </answer> 
        </answers> 
       </question> 
      </questions> 
     </quiz> 
    </data> 
</QuizMaster> 

Я пробовал следующий код PHP. Он начинает давать ошибку из второго ответа (// Ответ 2), где атрибутов для ответ. Ошибка подобна Предупреждение: SimpleXMLElement :: addAttribute(): Атрибут уже существует в C: \ wamp \ www \ quiz stack.php в строке 46. Я уже включил эту кодировку в несколько других мест в этом проекте, но во всех случаях у каждого вопроса был только один ответ.

<?php 
class SimpleXMLExtended extends SimpleXMLElement 
{ 
    public function addCData($cdata_text) 
    { 
     $node = dom_import_simplexml($this); 
     $no = $node->ownerDocument; 
     $node->appendChild($no->createCDATASection($cdata_text)); 
    } 
} 

$xmlFile = 'quiz_file.xml'; 
$xml = new SimpleXMLExtended('<QuizMaster/>'); 
// header 
$xml->header = NULL; 
$xml->header->addAttribute('version', '0.36'); 
$xml->header->addAttribute('exportVersion', '1'); 
$xml->data = NULL; 
// quiz 
$xml->data->quiz = NULL; 
$xml->data->quiz->autostart = ('false'); 
// forms 
$xml->data->quiz->forms = NULL; 
$xml->data->quiz->forms->addAttribute('activated', 'false'); 
$xml->data->quiz->forms->addAttribute('position', '0'); 
// Question Start 
$xml->data->quiz->questions = NULL; 
// Question answer loop starts here 
$xml->data->quiz->questions->question = NULL; 
$xml->data->quiz->questions->question->addAttribute('answerType', 'single'); 
// Question text 
$xml->data->quiz->questions->question->questionText = NULL; 
$xml->data->quiz->questions->question->questionText->addCData('What is the  city?'); 
$xml->data->quiz->questions->question->correctMsg = NULL; 
$xml->data->quiz->questions->question->incorrectMsg = NULL; 
// Answers start 
$xml->data->quiz->questions->question->answers = NULL; 
// Answer 1 
$xml->data->quiz->questions->question->answers->answer = NULL; 
$xml->data->quiz->questions->question->answers->answer->addAttribute('points', '1'); 
$xml->data->quiz->questions->question->answers->answer->addAttribute('correct', 'true'); 
$xml->data->quiz->questions->question->answers->answer->answerText = NULL; 
$xml->data->quiz->questions->question->answers->answer->answerText->addAttribute('html', 'false'); 
$xml->data->quiz->questions->question->answers->answer->answerText->addCData('Kolkata'); 
// Answer 2 
$xml->data->quiz->questions->question->answers->answer = NULL; 
$xml->data->quiz->questions->question->answers->answer->addAttribute('points', '1'); 
$xml->data->quiz->questions->question->answers->answer->addAttribute('correct', 'false'); 
$xml->data->quiz->questions->question->answers->answer->answerText = NULL; 
$xml->data->quiz->questions->question->answers->answer->answerText->addAttribute('html', 'false'); 
$xml->data->quiz->questions->question->answers->answer->answerText->addCData('Delhi'); 
// Answer 3 
$xml->data->quiz->questions->question->answers->answer = NULL; 
$xml->data->quiz->questions->question->answers->answer->addAttribute('points', '1'); 
$xml->data->quiz->questions->question->answers->answer->addAttribute('correct', 'false'); 
$xml->data->quiz->questions->question->answers->answer->answerText = NULL; 
$xml->data->quiz->questions->question->answers->answer->answerText->addAttribute('html', 'false'); 
$xml->data->quiz->questions->question->answers->answer->answerText->addCData('Mumbai'); 
// Answer 4 
$xml->data->quiz->questions->question->answers->answer = NULL; 
$xml->data->quiz->questions->question->answers->answer->addAttribute('points', '1'); 
$xml->data->quiz->questions->question->answers->answer->addAttribute('correct', 'false'); 
$xml->data->quiz->questions->question->answers->answer->answerText = NULL; 
$xml->data->quiz->questions->question->answers->answer->answerText->addAttribute('html', 'false'); 
$xml->data->quiz->questions->question->answers->answer->answerText->addCData('Chennai'); 
// Answer 5 
$xml->data->quiz->questions->question->answers->answer = NULL; 
$xml->data->quiz->questions->question->answers->answer->addAttribute('points', '1'); 
$xml->data->quiz->questions->question->answers->answer->addAttribute('correct', 'false'); 
$xml->data->quiz->questions->question->answers->answer->answerText = NULL; 
$xml->data->quiz->questions->question->answers->answer->answerText->addAttribute('html', 'false'); 
$xml->data->quiz->questions->question->answers->answer->answerText->addCData('Goa'); 
// Write Data 
$xml->saveXML($xmlFile); 
?> 

Если я закомментируйте обижая две линии (где AddAttribute применяется к ответ элемента) от каждого ответа, кроме ответа 1, то файл создается, но только один ответ, который содержит текст в Ответ 5.

Может ли кто-нибудь предложить, если есть какие-либо обходные пути для этой проблемы без изменения SimpleXMLElement объект?

+1

так где же линия 46? –

+0

Строка 46 находится всего в одной строке ниже комментария _ // Asnwer 2_ –

ответ

0

Вы используете код, который был Мент для использования с одним answer узлом, вы должны быть добавление Чайлдса вместо:

$answer2 = $xml->data->quiz->questions->question->answers->addChild('answer'); 
$answer2->addAttribute('points', '1'); 
$answer2->addAttribute('correct', 'false'); 
$answer2->answerText->addAttribute('html', 'false'); 
$answer2->answerText->addCData('Delhi'); 

$answer3 = $xml->data->quiz->questions->question->answers->addChild('answer'); 
$answer3->addAttribute('points', '1'); 
$answer3->addAttribute('correct', 'false'); 
$answer3->answerText->addAttribute('html', 'false'); 
$answer3->answerText->addCData('Mumbai'); 

Используйте этот подход для всех ваших ответов (событие первого ответа).

А теперь, принимая более глубокий взгляд, вы, возможно, придется использовать метод addChild для answerText узла также:

$answer3Text = $answer3->addChild('answerText'); 
$answer3Text->addAttribute('html', 'false'); 
$answer3Text->addCData('Mumbai'); 

Таким образом, код должен выглядеть следующим образом для всех ваших ответов:

$answer3 = $xml->data->quiz->questions->question->answers->addChild('answer'); 
$answer3->addAttribute('points', '1'); 
$answer3->addAttribute('correct', 'false'); 
$answer3Text = $answer3->addChild('answerText'); 
$answer3Text->addAttribute('html', 'false'); 
$answer3Text->addCData('Mumbai'); 
+0

Позвольте мне попробовать прямо сейчас. –

+0

Включая этот код вызывает следующую ошибку: ** Warning: SimpleXMLElement :: addAttribute(): Не удается найти родительский элемент в C: \ wamp \ www \ quiz stack.php в строке 41 **. Это содержимое строки _addAttribute_ of _answerText_. Также, поскольку определенный класс _SimpleXMLExtended_ не получает параметр, впоследствии, это также вызывает больше ошибок. –

+0

Да, ваше кодирование работало правильно. Спасибо за помощь. –

Смежные вопросы