Вопрос с конструкцией XML с использованием PHP - PullRequest
0 голосов
/ 14 июля 2009

В настоящее время я создаю XML-документ на PHP, который даст следующее:

<root>
  <collection>
    <region>1</region>
    <primary>John</primary>
  <collection>
  <collection>
    <region>1</region>
    <primary>Jane</primary>
  <collection>
  <collection>
    <region>2</region>
    <primary>Jill</primary>
  <collection>
<root>

Однако я хочу получить следующее:

<root>
  <collection>
    <region>1</region>
      <primary>John</primary>
      <primary>Jane</primary>
  <collection>
  <collection>
    <region>2</region>
      <primary>Jill</primary>
  <collection>
<root>

Чтобы получить первый XML-документ, я использую следующий код PHP:

$query = mysql_query("SELECT * FROM eventcal WHERE eventDate = '$date' ORDER BY region");

$doc = new DomDocument("1.0");

$root = $doc->createElement('data');
$root = $doc->appendChild($root);

if (@mysql_num_rows($query)) {
    while ($row=@mysql_fetch_assoc($query)) {   

        $node = $doc->createElement('collection');
        $node = $root->appendChild($node);

        foreach($row as $fieldname => $fieldvalue){
           $node->appendChild($doc->createElement($fieldname, $fieldvalue));
        }
    }
}

Могу ли я изменить этот PHP так, чтобы он имел "primary" как дочерний элемент для "region"?

Спасибо!


Извините, ребята, я имел в виду первичную как родного брата. Вы правы, тег коллекции станет излишним. Исходя из ваших комментариев, я думаю, что структура должна быть изменена на:

 <root>
   <collection>
     <region ID = "1">
       <primary>John</primary>
       <primary>Jane</primary>
     </region>
     <region ID = "2">
       <primary>Jill</primary>
   </collection>
 <root>

В таком случае моя проблема заключается в том, как изолировать регион в качестве родителя от ресурса MySQL, который возвращается из запроса?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 14 июля 2009

Я думаю, что вы хотите, это:

<?php

$query = mysql_query("SELECT * FROM eventcal WHERE eventDate = '$date' ORDER BY region");

$doc = new DomDocument("1.0");

$root = $doc->createElement('data');
$root = $doc->appendChild($root);

$currentRegionId = -1;
$currentRegionNode = null;

if (@mysql_num_rows($query)) {
        while ($row=@mysql_fetch_assoc($query)) {

        if ($row['region'] != $currentRegionId)
        {
            $currentRegionId = $row['region'];

            $node = $doc->createElement('collection');
            $node = $root->appendChild($node);

            $currentRegionNode = $doc->createElement('region');
            $currentRegionNode->setAttribute('id', $row['region']);
            $node->appendChild($currentRegionNode);
        }

        foreach($row as $fieldname => $fieldvalue){
            if ($fieldname != 'region')
                $currentRegionNode->appendChild($doc->createElement($fieldname, $fieldvalue));
        }
    }
}

?>
1 голос
/ 14 июля 2009

Сначала вам нужно лучше понять сам XML. Вы хотите, чтобы region был сложным типом, содержащим первичные элементы, поэтому вы, вероятно, захотите ввести новый элемент или атрибут для хранения идентификатора регионов. Например, вы можете, чтобы XML выглядел так: -

<root>
  <collection>
    <region ID="1">
      <primary>John</primary>
      <primary>Jane</primary>
    </region>
  </collection>
  <collection>
    <region ID="2">
       <primary>Jill</primary>
    </region>
  </collection>
</root>

Обратите внимание, что в настоящее время элемент коллекции стал излишним, поскольку он содержит только один элемент региона. Важно, что вы продолжаете развивать свою фактическую структуру XML, прежде чем писать больше кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...