使用 PHP 生成 XML 文件

Generate XML file using PHP

我需要使用具有以下结构的 PHP 生成一个 XML 文件。这个文件是一个测验的结构,每个问题有五个答案。问答文本包含在 CDATA 中。

<?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)开始给出错误,其中声明了 answer 元素的 attributes。错误类似于 Warning: SimpleXMLElement::addAttribute(): Attribute already exists in C:\wamp\www\quiz stack.php on line 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);
?>

如果我从除 answer 1,然后生成文件,但只有一个答案包含 Answer 5.

中的文本

任何人都可以在不更改 SimpleXMLElement 对象的情况下提出解决此问题的方法吗?

您使用的代码本来是要与单个 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');

对您的所有答案都使用此方法(事件是第一个答案)。

现在,深入了解一下,您可能还需要为 answerText 节点使用 addChild 方法:

$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');