Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Έχω ένα xml αρχείο, με την παρακάτω μορφή

 

>
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<actions>
<action name='Name1' home='Y' />
<action name='Name2' home='Y' />
<action name='Surname1' home='N' />
<action name='Test1' home='Y' />
<action name='Test10' home='N' />
</actions>

 

Αυτό το αρχείο μπορεί να έχει 1 εγγραφή (action) αλλά μπορεί να έχει και 1.000.

 

To parsing το κάνω έτσι:

>
$filename = "xml/test.xml";
$xmlFile = simplexml_load_file($filename);

 

Οι απορίες μου είναι οι παρακάτω:

1) Έχει μεγάλη διαφορά σε χρόνο για να διαβάζω ένα xml με 10 εγγραφές, της παραπάνω μορφής, από το να διαβάζω ένα xml με 1.000;

2) Εάν από το αρχείο θέλω να διαβάσω ΜΟΝΟ τις 5 πρώτες εγγραφές ας πούμε αυτό γίνεται ή πρέπει να κάνω Parsing όλο το xml και μετά να επιλέξω τις 5 πρώτες;

3) Θέλω να προσθέσω μία ακόμα εγγραφή στο xml μου, δηλαδή ένα ακόμα action, στην αρχή όμως του xml πως γίνεται αυτό; Έχω φτιάξει το παρακάτω κώδικα αλλά μου το δημιουργεί στο τέλος

>
$xmlFile = simplexml_load_file($filename);
$sxe = new SimpleXMLElement($xmlFile->asXML());	
$action = $sxe->addChild("action");
$action->addAttribute("name", $name);
$action->addAttribute("home", $home);
$sxe->asXML($filename); 

Δημοσ.

Οι απορίες μου είναι οι παρακάτω:

1) Έχει μεγάλη διαφορά σε χρόνο για να διαβάζω ένα xml με 10 εγγραφές, της παραπάνω μορφής, από το να διαβάζω ένα xml με 1.000;

 

2) Εάν από το αρχείο θέλω να διαβάσω ΜΟΝΟ τις 5 πρώτες εγγραφές ας πούμε αυτό γίνεται ή πρέπει να κάνω Parsing όλο το xml και μετά να επιλέξω τις 5 πρώτες;

 

3) Θέλω να προσθέσω μία ακόμα εγγραφή στο xml μου, δηλαδή ένα ακόμα action, στην αρχή όμως του xml πως γίνεται αυτό; Έχω φτιάξει το παρακάτω κώδικα αλλά μου το δημιουργεί στο τέλος

 

1. Γιατί δεν το δοκιμάζεις; Σίγουρα έχει διαφορά, τώρα το αν κατ' απόλυτη τιμή η διαφορά είναι τέτοια που να μπορείς να την καταλάβεις άλλο καπέλο.

2. Όπως προτιμάς. Αν χρησιμοποιήσεις DOM ή SimpleXML τότε το αρχείο γίνεται όλο parse επιτόπου, αλλά εσύ δε χρειάζεται να κάνεις τίποτα. Εναλλακτικά μπορείς να χρησιμοποιήσεις κάποιον stream-based XML parser (δηλαδή στην περίπτωσή μας XML Parser ή XMLReader τότε μπορείς να κάνεις parse μέχρι όπου νομίζεις εσύ. Από την άλλη όμως θα χρειαστεί να γράψεις κώδικα που θα κατευθύνει το parsing (προφανώς).

3. Πρώτα απ' όλα σκέψου λίγο τις εναλλακτικές. Θα μπορούσες π.χ. να έχεις ένα attribute order=0, 1, 2, 3... στα στοιχεία σου το οποίο να καθορίζει τη λογική σειρά τους, οπότε η σειρά τους μέσα στο αρχείο δε θα σε ενδιαφέρει. Δεν ξέρω αν αυτό που πας να κάνεις είναι καλύτερη ή χειρότερη ιδέα, αλλά έχε το υπόψη.

 

Δεύτερον ο κώδικας που δίνεις φαίνεται ότι παρσάρει αχρείαστα ξανά την xml σου ($xmlFile και $sxe αρχικά είναι το ίδιο πράγμα). Δεν ξέρω αν αργότερα έχει σημασία που έχεις δύο αντίγραφα, αλλά έχε το κι αυτό υπόψη.

 

Τέλος αυτό που θέλεις δε γίνεται απ' όσο γνωρίζω με SimpleXML, αλλά μπορείς πολύ εύκολα να γυρίσεις τον κώδικά σου να χρησιμοποιεί DOM με το οποίο γίνεται.

 

Update:

 

Τελικά απ' ότι ανακάλυψα μπορείς να κάνεις λίγη μόνο από την επεξεργασία σε DOM και να μη χρειαστεί να αλλάξεις όλο τον κώδικα που έχεις ήδη σε SimpleXML. Παρόλα αυτά θα σου πρότεινα αν δεν είναι μεγάλη δουλειά να το κάνεις, προσωπικά βρίσκω ότι σε DOM έχεις πολύ περισσότερη ευκολία απ' ότι σε SimpleXML (δύσχρηστο interface τελείως).

 

>
$xmlFile = simplexml_load_string(...);
$action = new SimpleXMLElement('<action></action>');
$action->addAttribute("name", "foo");
$action->addAttribute("home", "bar");
prependChild($xmlFile, $action);

echo htmlspecialchars($xmlFile->asXML());

function prependChild($el, $child) {
   $dom = dom_import_simplexml($el);

   // Οι 3 παρακάτω γραμμές με κάνουν και ντρέπομαι,
   // αλλά δε γίνεται αλλιώς αν θέλεις η function
   // να δουλεύει ως έχει.
   $fragment = $dom->ownerDocument->createDocumentFragment();
   list(, $xml) = explode('?>', $child->asXML(), 2);
   $fragment->appendXml(trim($xml));
   $dom->insertBefore(
       $fragment,
       $dom->firstChild
   );

   return simplexml_import_dom($dom);
}

Δημοσ.

Με την προτροπή σου defacer να ασχοληθώ με DOM και παρακάτω έχω τον κώδικα για την δημιουργία του αρχείου xml

>
$doc = new DOMDocument('1.0', 'utf-8');
$doc->formatOutput = true;
$doc->preserveWhiteSpace = false;
	
$root = $doc->createElement( "actions" );
$doc->appendChild( $root );
			
$element = $doc->createElement( "action" );
			
$attribute = $doc->createAttribute("name");
$attribute->value = $name;
			
$attribute2 = $doc->createAttribute("home");
$attribute2->value = $homr;
			
$element->appendChild($attribute);
$element->appendChild($attribute2);
			
$root->appendChild( $element );
		
$doc->save("test.xml");

 

και για να προσθέσω ένα νέο element στην αρχή του xml χρησιμοποίησα την insertBefore που μου πρότεινες και ο κώδικας είναι ο παρακάτω

>
//This function inserts a new child  as the first child of $currentNode 
function insertNewChild($currentNode, $node)
{
 $currentNode->insertBefore($node, $currentNode->firstChild);   
}
		
$doc = new DOMDocument();
$doc->preserveWhiteSpace = false;
$doc->formatOutput = true;
$doc->load($filename);	
			
//Set the reference node
$allContents = $doc->getElementsByTagName("actions");
$contents = $allContents->item(0);
			
//create a new element
$newElement = $doc->createElement("action");
$attribute = $doc->createAttribute("name");
$attribute->value = $name;
			
$attribute2 = $doc->createAttribute("home");
$attribute2->value = $home;
			
$newElement->appendChild($attribute);
$newElement->appendChild($attribute2);
			
//Call the insertNewChild function 
insertNewChild($contents,$newElement);
			
$doc->save("test.xml");

 

Εάν έχεις να προτείνεις κάποια αλλαγή στην κώδικα πολύ ευχαρίστως να το ακούσω.

 

Το μόνο που χρειάζομαι πλέον είναι να κάνω parsing μόνο τις 5 πρώτες εγγραφές και όχι όλο το xml (για θέμα χρόνου εκτέλεσης).

Εάν δεν μπορέσω να το βρω θα αρκεστώ στον παρακάτω κώδικα

>
$actions = $doc->getElementsByTagName("action");
$count = 0;
foreach($actions as $action)
{
 echo $action->getAttribute('name').' - '.$action->getAttribute('home').'<br />';
 $count++;
				
 if ($count > 4)
 {
   exit();
 }
}

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...