Jump to content
php.lv forumi

Citiem viegli.. citiem nee..


SadDemon

Recommended Posts

  • Replies 81
  • Created
  • Last Reply

Top Posters In This Topic

Balstoties uz v3rb0 iepriekš nopostēto skriptu, mazliet izpratu funkcijas principus un izveidoju līdzīgu funkciju, kas visu iekļauj iekš array().. tas manai acij draudzīgāks izskatās..

 

*.php

<?php


function domToArray($node, $level = 0) {

$array = array();

// if node has attributes
if ($node->hasAttributes()) {
	$attributes = $node->attributes;

	if (!is_null($attributes)) {
		foreach ($attributes as $attribute) {
			$array[$attribute->name] = $attribute->value;

			echo "[".$level."]\n".$array[$attribute->name]."<br>";
		}
	}
}

// if node has childnodes
if ($node->hasChildNodes()) {
	$child = $node->childNodes;

	for ($i = 0; $i < $child->length; $i++) {
		$iChild = $child->item($i);
		$array[$iChild->nodeName] = domToArray($iChild, $level+1);
	}
}
}

$xml_source = "tree_source.xml";
$dom = new DomDocument();
$dom->load($xml_source);

domToArray($dom);

?>

 

 

Jautājums ir - kā lai piekļūst kādam konkrētam mezglam?

Link to comment
Share on other sites

Atgriez tos masīvus no funkcijas - http://php.net/return.

 

Tik sliktums zini kāds - ar šādu funkciju tu pazaudē visu DOM parsera izmantošanas jēgu. Tad jau vienkāršāk (un efektīvāk izpildes ātruma un izmantotās atmiņas ziņā) ir lietot SAX parseri, kas salasīs tev tās nodes masīvos. DOM jēga jau ir tieši tāda, ka tev ir pieejams viss kods atmiņā piekļūšanai patvaļīgām nodēm pēc tavas patikas.

Link to comment
Share on other sites

Izskaidrošu visu smalkāk:

 

Gala produkts ir administrēšana galerijai iekš Flash.. kur ir tree komponents, kas saņem datus no *.xml:

<node label="---- galerijas">
<node label="---- (galerija)">
	<node label="---- (kategorija)">
		<node label="--.jpg"/>
	</node>

	<node label="---- (kategorija)">
		<node label="----.jpg"/>
		<node label="----.jpg"/>
		<node label="----.jpg"/>
	</node>
</node>
</node>

 

..un datus par attēliem saņem no attiecīga *.xml:

<gallery title="----" thumbDir="-----" imageDir="----" random="false">
<category name="----">
	<image>
		<date>----</date>
		<title>----</title>
		<desc>----</desc>
		<thumb>----.jpg</thumb>
		<img>----.jpg</img>
	</image>
</category>
</gallery>

 

Mainot informāciju, ar *.php nomainam konkrētās nodes label atribūtu pirmajā *.xml un informāciju otrajā *.xml..

 

Te arī tā problēma, kad cenšos pirmajā *.xml failā piekļūt nodēm, ņemot galerijas nodes indexu.. galerijas nodes indexu un attēla nodes indexu..

Link to comment
Share on other sites

Nu iespējams pagaidām esmu kaut nedauds virzījies uz priekšu.. Tākā iepriekšējais label man ir pieejams iekš Flash, tad ir iespēja salīdzināt un pārrakstīt..

 

*.php:

<?php


function domToArray($node, $level = 0) {

$array = array();

// if node has attributes
if ($node->hasAttributes()) {
	$attributes = $node->attributes;

	if (!is_null($attributes)) {
		foreach ($attributes as $attribute) {
			$array[$attribute->name] = $attribute->value;

			echo "[".$level."]\n".$array[$attribute->name]."<br>";

			// if nodes attribute equals value, update attribute
			if ($array[$attribute->name] == "----.jpg") {
				$node->setAttribute("label", $array[$attribute->name]." [testējam]");

				// save
				global $dom;
				global $xml_source;
				$dom->save($xml_source);
			}
		}
	}
}

// if node has childnodes
if ($node->hasChildNodes()) {
	$child = $node->childNodes;

	for ($i = 0; $i < $child->length; $i++) {
		$iChild = $child->item($i);
		$array[$iChild->nodeName] = domToArray($iChild, $level+1);
	}
}
}

$xml_source = "tree_source.xml";
$dom = new DomDocument();
$dom->load($xml_source);

domToArray($dom);

?>

Link to comment
Share on other sites

Eh.. ka nesaprotu šito ņemšanos. Es būtu rakstījis sekojoši:

<?php

 function change($root, $kat, $idx, $target)
 {
$galerijas = $root->getElementsByTagName("node");

// visaam galerijaam
foreach ($galerijas as $galerija)
{
  $kategorijas = $galerija->getElementsByTagName("node");

  // meklee konkreeto kategoriju
  foreach ($kategorijas as $kategorija)
  {
	if ($kategorija->getAttribute("label") == $kat)
	{
	  $childs = $kategorija->getElementsByTagName("node");

	  if ($idx < $childs->length)
	  {
		$childs->item($idx)->setAttribute("label", $target);
		return true; // ir nomainiits
	  }
	  else
	  {
		return false; // nav taada indeksa konkreetajaa kategorijaa
	  }
	}
  }
}
return false; // nav taadas kategorijas
 }


 $kat = "kategorija_b"; // kuru kategoriju mainiit
 $idx = 1; // otrais elements
 $target = "uz_ko_nomainiit_labeli";


 $dom = new DomDocument();
 $dom->load("a.xml");

 $result = change($dom->documentElement, $kat, $idx, $target);
 if ($result == false)
 {
echo "Kautkaads errors, lol!\n";
 }

 $dom->save("b.xml");
?>

 

Un ja tas ir par lēnu, tad aizvietotu visus fjas getElementsByTagName() izsaukumus par ->firstChild, un visus foreach ciklus par ->nextSibiling

Link to comment
Share on other sites


×
×
  • Create New...