php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2006

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 18.06.2006, 15:33  
Benutzer
 
Registriert seit: 26.07.2005
Beiträge: 82
chiliGREEN
Standard xml und PHP

hi

zuerst einmal nehm ich den fleißigen poster die arbeit ab:


so

bitte erspart mir jetzt tutorial-posts....


naja...zum problem



beispiel code:
Code:
<?xml version="1.0"?>
<map width="1000" height="1000" templex="0" templey="0" templez="0">
<tile x="209" y="267" z="6">
<item id="1198"/>
</tile>
<tile x="219" y="267" z="6">
<item id="1198"/>
</tile>
<tile x="230" y="267" z="6">
<item id="1198"/>
</tile>
<tile x="208" y="268" z="6">
<item id="1198"/>
</tile>
<tile x="209" y="268" z="6">
<item id="1202"/>
</tile>
<tile x="213" y="268" z="6">
<item id="1199"/>
</tile>
<tile x="218" y="268" z="6">
<item id="1198"/>
</tile>
<tile x="219" y="268" z="6">
<item id="1202"/>
</tile>

das geht nach unten noch seitenweise weiter... (28MB -.-)



leider stimmen alle x="" und y="" nicht...


jetzt müsste jeder x="" und y="" wert um 100 erhöht werden...


und das ihr nicht sagts, ich habs nicht versucht...







das funktioniert einmal... siehe code oben, 2. zeile:
<map width="1000" ....... 1000 wird angezeigt...


PHP-Code:

$map 
simplexml_load_string(file_get_contents("map.xml"));

$x $map['width'];

echo 
"$x"
kA wie ich das für über 40000 <tile x="" y=""... machen kann













lg
btw und bitte keine "schau ins forum" oder "mach selbst" oder "lern xml" oder sonst irgendwelche weisheitsbeiträge
chiliGREEN ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 18.06.2006, 16:08  
Erfahrener Benutzer
 
Registriert seit: 08.05.2005
Beiträge: 814
andy
andy eine Nachricht über ICQ schicken
Standard

Wie wäre es denn mit foreach?
__________________
Zitat:
Diese Erweiterung ist EXPERIMENTELL.
[...]
Seien Sie gewarnt und verwenden Sie diese Erweiterung auf eigenes Risiko..
andy ist offline  
Alt 18.06.2006, 20:29  
Benutzer
 
Registriert seit: 26.07.2005
Beiträge: 82
chiliGREEN
Standard

YEAH....foreach()


thx...das könnt hinhaun...


aber so siehts aus:
Zitat:
<tile x="219" y="267" z="6">
<item id="1198"/>
</tile>
<tile x="230" y="267" z="6">
<item id="1198"/>
</tile>
<tile x="208" y="268" z="6">
<item id="1198"/>
</tile>
<tile x="209" y="268" z="6">
<item id="1202"/>
</tile>

foreach dafür braucht man doch einen array... wollte das problem so lösen


PHP-Code:
$map simplexml_load_string(file_get_contents("map.otx")); 

$x[] = $map['x']; 

funktioniern tuts net^^


aber kA wie ich das sonst machen soll



danke für die hilfe...ab jezt schreib ich immer die links von den tutorials hin^^

lg
chiliGREEN ist offline  
Alt 18.06.2006, 22:30  
Erfahrener Benutzer
 
Registriert seit: 08.05.2005
Beiträge: 814
andy
andy eine Nachricht über ICQ schicken
Standard

Funzt net?!
Jetzt bekommste nen Tutorialpost!
http://zend.net/php5/articles/php5-x...ew=1#Heading14
__________________
Zitat:
Diese Erweiterung ist EXPERIMENTELL.
[...]
Seien Sie gewarnt und verwenden Sie diese Erweiterung auf eigenes Risiko..
andy ist offline  
Alt 24.07.2006, 13:06  
Benutzer
 
Registriert seit: 26.07.2005
Beiträge: 82
chiliGREEN
Standard

ich habs (teilweise) geschafft:

bei der PHP 5.1 gibs einen xml writer:

PHP-Code:
$xmlwr xmlwriter_open_memory();
xmlwriter_set_indent($xmlwrtrue);
xmlwriter_start_document($xmlwr);
xmlwriter_start_element($xmlwr"map");



$mainfile simplexml_load_file("xxx.otx"); 

foreach(
$mainfile->xpath('/map/tile') as $item) { 

$x $item['x'];
$y $item['y'];
$z $item['z'];
$pz $item['pz'];
$ground $item['ground'];


xmlwriter_start_element($xmlwr"tile");
xmlwriter_write_attribute($xmlwr"x""$x");
xmlwriter_write_attribute($xmlwr"y""$y");
xmlwriter_write_attribute($xmlwr"z""$z");
xmlwriter_write_attribute($xmlwr"pz""$pz");
xmlwriter_write_attribute($xmlwr"ground""$ground");

foreach(
$mainfile->xpath('map/tile/item') as $newitem) { 
$id $item['id'];
xmlwriter_start_element($xmlwr"item");
xmlwriter_write_attribute($xmlwr"id""$id");
xmlwriter_end_element($xmlwr);
}

xmlwriter_end_element($xmlwr);


}



xmlwriter_end_element($xmlwr);
xmlwriter_end_document($xmlwr);



$newmap xmlwriter_output_memory($xmlwr);

file_put_contents("newmap.otx"$newmap); 

also:

das 1. foreach geht alles <tile x="" y="" z="" ..... durch

Code:
$x = $item['x'];
$y = $item['y'];
$z = $item['z'];
$pz = $item['pz'];
$ground = $item['ground'];
hier kann man einstelln, um wieviel das ganze verschoben wird ($x = $item['x'] +1...





Zitat:
xmlwriter_start_element($xmlwr, "tile");
xmlwriter_write_attribute($xmlwr, "x", "$x");
xmlwriter_write_attribute($xmlwr, "y", "$y");
xmlwriter_write_attribute($xmlwr, "z", "$z");
xmlwriter_write_attribute($xmlwr, "pz", "$pz");
xmlwriter_write_attribute($xmlwr, "ground", "$ground");
hier kommts in die xml datei





Hier ist das Problem:
Code:
foreach($mainfile->xpath('map/tile/item') as $newitem) { 
$id = $item['id'];
xmlwriter_start_element($xmlwr, "item");
xmlwriter_write_attribute($xmlwr, "id", "$id");
xmlwriter_end_element($xmlwr);
}


Manche Tiles sehen so aus:
<tile x="230" y="267" z="6">
<item id="1198"/>
<item id="1198"/>
<item id="1198"/>
</tile>

ich bräuchte eine foreach in einer foreach schleife... zuerst soll jedes tile neu gemacht werden... und in einem tile dann noch die zusätzlichen <item id="">....



lg
chiliGREEN ist offline  
Alt 24.07.2006, 13:12  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von chiliGREEN
YEAH....foreach()
...
foreach dafür braucht man doch einen array...
Nein, nicht unbedingt.
foreach($map as $tile) bspw funktioniert hier auch.

Und das hättest Du sogar wissen können
Zitat:
Zitat von chiliGREEN
foreach($mainfile->xpath(...
 
Alt 28.07.2006, 21:52  
Benutzer
 
Registriert seit: 26.07.2005
Beiträge: 82
chiliGREEN
Standard

moment.... das versteh ich jetzt net ganz -.-



ich hab ein foreach script für die 1000 <tile>-tags gmacht:
Zitat:
foreach($mainfile->xpath('/map/tile') as $item) {
de schaun so aus...:

<tile x="" y="" z="" pz="" ground="">
<item id=""/>
<item id=""/>
<item id=""/>
<item id=""/>
<item id=""/>
<item id=""/>
<item id=""/>
</tile>

und von denen gibs mindestens 1000




die obere foreach schleife ist für alle <tile>-tags ---> xpath('/map/tile')



aber in jedem tile-tag sind nochmal bis zu 10 <item>-tags... es können ja mehrere items auf einen feld liegn...

btw... damit hab ich es versucht ... (geht net): ---> xpath('/map/tile/item')



ich hab leider kA wie man das Problem lösen könnte

lg
chiliGREEN ist offline  
Alt 28.07.2006, 22:48  
Gast
 
Beiträge: n/a
Standard

Ah, jetzt verstehe ich Dein Problem.
Du kannst das Datenmodell einfach ändern und dann wieder komplett in eine XML Zeichenkette umwandeln lassen.
Aber dann nimmst Du besser gleich DOM (und nicht SimpleXML)

PHP-Code:
<?php
$doc 
DOMDocument::load('map.xml');

$xpath = new DOMXPath($doc);
$nodeset $xpath->query('//tile');
foreach(
$nodeset as $node) {
    
$attr $node->getAttributeNode('x');
    
$attr->value += 100;
    
    
$attr $node->getAttributeNode('y');
    
$attr->value += 100;
}

echo 
$doc->saveXML();
?>
 
Alt 29.07.2006, 16:19  
Waq
Erfahrener Benutzer
 
Registriert seit: 15.08.2004
Beiträge: 2.473
Waq
Standard

Ähm, das ist das einzige, was da drin steht?
Und das erhöhen um 100 ist die einzige Aufgabe?

Dann würd ich das ganze per Regex machen:
$new_file_content = preg_replace("{\b(x|y)=\"(\d+)\"}e",'"\\1=\\"".(\\ 2+100)."\\""',$old_file_content);
Waq ist offline  
Alt 30.07.2006, 16:15  
Benutzer
 
Registriert seit: 26.07.2005
Beiträge: 82
chiliGREEN
Standard

PHP-Code:
<?php 
$doc 
DOMDocument::load('map.xml'); 

$xpath = new DOMXPath($doc); 
$nodeset $xpath->query('//tile'); 
foreach(
$nodeset as $node) { 
    
$attr $node->getAttributeNode('x'); 
    
$attr->value += 100
     
    
$attr $node->getAttributeNode('y'); 
    
$attr->value += 100


echo 
$doc->saveXML(); 
?>
hier kommt ein leeres fenster :/









PHP-Code:
<?php
$new_file_content 
preg_replace("{\b(x|y)=\"(\d+)\"}e",'"\\1=\\"".(\\2+100)."\\""',$old_file_content);
?>
da kenn ich mich zwar net aus, aber es funktionert^^


lg
chiliGREEN ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
xmlwriter_write_attribute, foreach seitenweise xml datei, xmlwriter_write_attribute yymmdd, xml mit php mappen, otx-datenmodell, xml schreiben mit dom php, mapping xml to php, simplexml_load_file seitenweise anzeigen, php domxpath getattributenode, php getattributenode example, php?id=82 probleme in xml

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:05 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.