PHP SimpleXML显示不规则的子节点

时间:2014-06-30 11:20:41

标签: php simplexml

我有一个包含不规则子节点数量的XML文件,并希望显示问题和子节点。问题的显示是正确的,但我仍然坚持正确显示子节点。

<Survey>
  <Question ID="1">
    <QuestionText>Question Number 1</SurveyQuestionText>
     <AnswerText>Answer 1</SurveyAnswerText>
     <AnswerText>Answer 2</SurveyAnswerText>
     <AnswerText>Answer 3</SurveyAnswerText>
     <AnswerText>Answer 4</SurveyAnswerText>
     <AnswerText>Answer 5</SurveyAnswerText>
  </Question>   
  <Question ID="2">
    <QuestionText>Question Number 2</SurveyQuestionText>
     <AnswerText>Answer 1</SurveyAnswerText>
     <AnswerText>Answer 2</SurveyAnswerText>
     <AnswerText>Answer 3</SurveyAnswerText>
  </Question>   
  <Question ID="3">
    <QuestionText>Question Number 3</SurveyQuestionText>
     <AnswerText>Answer 1</SurveyAnswerText>
     <AnswerText>Answer 2</SurveyAnswerText>
     <AnswerText>Answer 3</SurveyAnswerText>
     <AnswerText>Answer 4</SurveyAnswerText>
  </Question>   
</Survey>

到目前为止,这是我的代码

$xml_url = "questions.xml";
$xml = simplexml_load_file($xml_url); 

$x = 1;


foreach($xml->children() as $question) {
   echo $x . ".) " . $question->QuestionText . "\n";
   $numAnswers = $question->AnswerText->count();
   echo "count: " . $numAnswers . "\n";

   //insert code for display AnswerText

   $x++;    
}

到目前为止,这是我的输出:

1.) Question Number 1
count: 5
2.) Question Number 2
count: 3
3.) Question Number 3
count: 4

2 个答案:

答案 0 :(得分:2)

只需为答案添加第二个内部foreach:

foreach($xml->children() as $question) {
   echo $x . ".) " . $question->QuestionText . "\n";
   $numAnswers = $question->AnswerText->count();
   echo "count: " . $numAnswers . "\n";

   //insert code for display AnswerText
   foreach($question->AnswerText as $answers)
       echo $answer;

   $x++;    
}

SimpleXML拥有非常有用的访问机制。例如,Iterator,在这里使用。

在此处阅读所有内容:http://www.php.net/manual/en/simplexml.examples-basic.php

答案 1 :(得分:1)

我不确定我是否误解了这个问题,但是为了循环答案,你只需要一个嵌套的foreach循环:

$question_number = 1;

foreach($xml->children() as $question) {
   echo $question_number . ".) " . $question->QuestionText . "\n";
   $numAnswers = $question->AnswerText->count();
   echo "count: " . $numAnswers . "\n";

   $answer_number = 1;
   foreach ( $question->children() as $answer_text ) {
       echo "   " . $answer_number . ".)" . $answer_text . "\n";
       $answer_number++;
   }    

   $question_number++;    
}

或者,如the Basic SimpleXML Usage manual page所示,您可以循环使用具有特定名称的孩子,这样可以更明显地发生了什么:

foreach ( $xml->Question as $question ) {
     // ...
     echo $question->QuestionText;
     // ...
     foreach ( $question->AnswerText as $answer_text ) {
          // ...
          echo $answer_text;
          // ...
     }
 }