簡體   English   中英

使用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元素的屬性 該錯誤類似於警告:SimpleXMLElement :: addAttribute():屬性在第46行的C:\\ wamp \\ www \\ quiz stack.php中已經存在 我已經在該項目的其他地方加入了這種編碼,但是在所有情況下,每個問題只有一個答案。

<?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);
?>

如果我注釋掉除了答案1之外的每個答案中令人反感的兩行(將addAttribute應用於答案元素),那么將生成文件,但只有一個答案包含答案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');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM