XML inşaat PHP kullanarak soru

2 Cevap php

Şu anda, aşağıdaki verecek PHP bir XML belgesi inşa ediyorum:

<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>

Ancak, aşağıdaki almak için arıyorum:

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

Ilk XML dokümanı almak için, aşağıdaki PHP kodu kullanıyorum:

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

Me "bölge" bir çocuk gibi "birincil" sahip olduğunu PHP değiştirmek mümkün mü?

Teşekkürler!


Üzgünüm beyler, bir kardeş olarak birincil geliyordu. Haklısın, toplama etiketi gereksiz olacaktı. Yorumlarınızı dayanarak, yapısı değişmesi gerektiğini düşünüyorum:

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

Benim sorunum o zaman, nasıl sorgudan döndürülen MySQL kaynaktan bir ebeveyn olarak bölgeyi izole edebilir?

Teşekkürler.

2 Cevap

Ben ne istiyorum bu olduğunu düşünüyorum:

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

?>

Önce iyi XML kendisini anlamak gerekir. Sen bölge muhtemelen yeni bir unsur tanıtmak veya bölgelerin kimliğini tutmak atfetmek istiyorum dolayısıyla birincil öğeleri içeren karmaşık bir tip olmak istiyorum. Örneğin xml Bu bakmak bakmak isteyebilirsiniz: -

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

Sadece şimdiye kadar tek bir bölge elemanı tutan beri toplama elemanı superflous haline gelmiştir nasıl şu anda unutmayın. Onun önemlidir Eğer artık kod yazmaya başlamadan önce actual XML yapısı gelişmeye devam.