php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > XML
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


XML Hier passt alles rein, was das Thema XML (XSLT, JSON etc...) betrifft, auch in Verbindung mit PHP

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 06-12-2007, 10:45
Coniaric
 Registrierter Benutzer
Links : Onlinestatus : Coniaric ist offline
Registriert seit: Apr 2004
Beiträge: 324
Coniaric ist zur Zeit noch ein unbeschriebenes Blatt
Standard Nächsten Knoten auslesen

Hallo,

hab ein etwas kniffliges Problem (zumindest für mich):

So lese ich die Inhalte der Knoten aus:
(Hab es stark gekürzt, das funtkioniert auch soweit)

PHP-Code:

$xml 
domxml_open_file('test2.xml');
$xpc Xpath_new_context($xml);

$ok=xpath_register_ns($xpc,'iw','http://www.url.de');


$nodeList Xpath_eval($xpc"//iw:immobilie[$i]/iw:zustand_angaben/iw:baujahr"); // nur als ein Beispiel
$node $nodeList->nodeset[0];
$baujahr[] = $node->get_content(); 
Das XML sieht im Groben so aus:

PHP-Code:
...
    <
iw:immobilie>
<
iw:objektkategorie>
    <
iw:nutzungsart WOHNEN="true"/>
    <
iw:vermarktungsart KAUF="true"/>
                   <
iw:objektart>
                       <
iw:haus haustyp="EINFAMILIENHAUS"/>
                   </
iw:objektart>
</
iw:objektkategorie>
...
<
iw:immobilie>
... 
In dem XML können mehrere Datensätze vorhanden sein, die immer mit dem immobilie-Tag umschlossen sind. Also lese ich das in einer Schleife aus.

Mein Problem ist jetzt, daß der TAG

<iw:haus haustyp="EINFAMILIENHAUS"/>

auch mal

<iw:buero_praxen buero_typ="BUEROFLAECHE"/>

heißen kann - oder auch sonstwie.
Wie kann ich das Abfangen?

Ich müßte also irgendwie sagen können

IF (der TAG, der innerhalb des objektart -TAGs liegt != iw:haus)
$objektart="nicht Haus";

Ich hab jetzt einiges Versucht, aus Verzeiflung sogar die Durchgänge gezählt und die entsprechenden ausgetauscht, aber das klappt immer nur bis zu einem bestimmten Punkt.
Es muß doch irgendwie möglich sein, den Tag, der innerhalb eines anderen liegt auszulesen, ohne ihn zu kennen? Bin da echt schon zwei Tage am rätseln...

Danke schonmal,

Grüße,
Coni
Mit Zitat antworten
  #2 (permalink)  
Alt 06-12-2007, 11:06
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Dü könntest DomNode->first_child() oder ->child_nodes() mit DomNode->node_type() kombinieren.
Mit Zitat antworten
  #3 (permalink)  
Alt 06-12-2007, 11:08
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Code:
//iw:immobilie/iw:objektkategorie/iw:vermarktungsart/iw:objektart/*
Mit Zitat antworten
  #4 (permalink)  
Alt 06-12-2007, 11:13
Coniaric
 Registrierter Benutzer
Links : Onlinestatus : Coniaric ist offline
Registriert seit: Apr 2004
Beiträge: 324
Coniaric ist zur Zeit noch ein unbeschriebenes Blatt
Standard

@onemorenerd: Werd ich mich gleich mit beschäftigen
@phpdesaster: Äh... was willst Du mir sagen?
Mit Zitat antworten
  #5 (permalink)  
Alt 06-12-2007, 11:16
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Naja, ein XPath, mit dem du auf den Knoten zugreifen kannst, oder hab ich da was vercheckt?
Mit Zitat antworten
  #6 (permalink)  
Alt 06-12-2007, 11:43
Coniaric
 Registrierter Benutzer
Links : Onlinestatus : Coniaric ist offline
Registriert seit: Apr 2004
Beiträge: 324
Coniaric ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich glaub, ich versteh Dich nicht ganz... also der Knotenname kann sich ändern. Er kann einmal

<iw:haus haustyp="EINFAMILIENHAUS"/>

einmal

<iw:haus />

einmal

<iw:wohnung wohnungtyp="XYZ"/>

einmal

<iw:wohnung />

usw.

heißen. Und das muß ich irgendwie abfangen, also z.B., wenn der Knoten nicht HAUS (und zwar mit sämtlich möglichen folgenden Attributen) heißt, dann muß was passieren.
Ich brauche alles, was mit <iw:haus beginnt, weiß aber nicht, was noch als Attribute folgen kann und auch nicht, was an anderen TAGs anstatt "haus" drinstehen kann.

Hab ich jetzt dich falsch verstanden oder Du mich?
Mit Zitat antworten
  #7 (permalink)  
Alt 06-12-2007, 12:20
Coniaric
 Registrierter Benutzer
Links : Onlinestatus : Coniaric ist offline
Registriert seit: Apr 2004
Beiträge: 324
Coniaric ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Grrrr, und http://de.php.net/ ist gerade down.... Alles ist gegen mich heute! ;-)
Mit Zitat antworten
  #8 (permalink)  
Alt 06-12-2007, 12:20
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Mit meinem Pfad kannst du dir den Knoten holen und weiter untersuchen, beispielsweise auf den Tagnamen oder die Attribute. Alternativ kannst du auch statt dem * iw:haus verwenden. Bekommst du dann keine Ergebnisse, ist es halt kein oder ein anderer Knoten. Willst du den Knoten aber verarbeiten, musst du ersteres verwenden.
Mit Zitat antworten
  #9 (permalink)  
Alt 06-12-2007, 13:13
Coniaric
 Registrierter Benutzer
Links : Onlinestatus : Coniaric ist offline
Registriert seit: Apr 2004
Beiträge: 324
Coniaric ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Puh... also ich hab jetzt mal versucht, das in meine Schleife reinzukriegen, funzt so aber nicht...

PHP-Code:

$array_element 
Xpath_eval($xpc"//iw:immobilie[$i]/iw:objektkategorie/iw:objektart/*");
//$array_element = $xml->get_elements_by_tagname("haus");
//print_r ($array_element);


if (isset($array_element[$attribzaehler]))
{
      
$haus$array_element[$attribzaehler];
    
$attList $haus-> attributes();
    foreach (
$attList as $attrib) {
    
$typ[$attribzaehler] = $attrib->name;
      }
}
else
{
        
$array_element Xpath_eval($xpc"//iw:immobilie[$i]/iw:objektkategorie/iw:objektart/*");

        if (isset(
$array_element[$attribzaehler]))
        {
              
$wohnung$array_element[$attribzaehler];
        
$attList $wohnung-> attributes();
        if(
$attList)
            {
        foreach (
$attList as $attrib)
               {
        
$typ[$attribzaehler] = $attrib->name;

               }
            }
          else
          {
          
$typ[$attribzaehler] = "nix";
          }
        }
        else

        
$typ[$attribzaehler] = "keine Angabe";

        }

Muß natürlich noch irgendwie $array_element anpassen... vorher stand das drin, was im ersten Kommentar steht.
Aber ab einem Element, das anders heißt, funzt es nicht mehr. (die alte Version)
Mit Zitat antworten
  #10 (permalink)  
Alt 06-12-2007, 13:23
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Ich verstehe nicht ganz, was du da machst. Kenne die DOM XML Funktionen zwar jetzt nicht, ich mach einfach mal ein Beispiel mit den PHP5 DOM Funktionen.
PHP-Code:
$xpath = new XPath$theDoc );
$nodeList $xpath->query'//iw:immobilie['.$i.']/iw:objektkategorie/iw:objektart/*' );
for( 
$c=0$c<$nodeList->length$c++ ) {
   
$tagname $nodeList->item$c )->nodeName;
   
$attributes $nodeList->item$c )->attributes;
   
// vielleicht auch ohne Namespace, weiß ich jetzt nicht genau!
   
if( $tagname == 'iw:haus' ) {
       
// Ist ein Haus!
   
}
   else {
       
// Ist kein Haus!
   
}

Das sollte ja auf deine Funktionen portierbar sein!
Mit Zitat antworten
  #11 (permalink)  
Alt 06-12-2007, 13:38
Coniaric
 Registrierter Benutzer
Links : Onlinestatus : Coniaric ist offline
Registriert seit: Apr 2004
Beiträge: 324
Coniaric ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Okay, danke schonmal, probier ich gleich aus.

OffTopic:

Tipp: Wenn Ihr eine Katze habt, programmiert nicht im Schlafanzug.
Meine hat mir grad in die Eier gekrallt, verdammt, tut das weh...

Mit Zitat antworten
  #12 (permalink)  
Alt 06-12-2007, 14:33
Coniaric
 Registrierter Benutzer
Links : Onlinestatus : Coniaric ist offline
Registriert seit: Apr 2004
Beiträge: 324
Coniaric ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Okay, hab es - jetzt muß ich "nur" noch ganz vorsichtig meine ganzen anderen Funktionen unterbringen. Manchmal sollte man ein Extra Script machen, in dem es nur um das aktuelle Problem geht, da sieht man viel mehr... jetzt zumindest sieht es für mich total logisch und einfach aus.
(Um das ganze liegt eine for-Schleife mit $i)
PHP-Code:

$nodeList 
Xpath_eval($xpc"//iw:immobilie['$i']/iw:objektkategorie/iw:objektart/*"); // hier lag 
// im Grunde das Problem, das ich woanders gesucht hab - der * war der entscheidende Hinweis!

$node $nodeList->nodeset[$i];

   
$tagname $node->node_name();
   
   echo 
$tagname;
 if(
$tagname=="haus")
 {
 echo
" Es ist ein Haus.<br>===========";
 }
 elseif(
$tagname=="wohnung")
 {
 echo
" Es ist eine Wohnung.<br>===========";
 }
 else
  {
 echo
" Es ist was anderes.<br>===========";
 } 
Ist natürlich eine ultra-abgespeckte Version; im fertigen Script sind dann 64 Felder zum Teil mit sehr unterschiedlichen Attributen, in denen sich pro XML-Datei hunderte Datensätze befinden können. Ich hoffe, es wird jetzt nur noch viel Schreibarbeit, sonst lande ich bald wieder hier...

Wenn ich da noch später die Attribute anständig reingewurschtelt kriege, dann war Dein Hinweis mit der Wildcard meine Rettung!

Vielen Dank!

Coni
Mit Zitat antworten
  #13 (permalink)  
Alt 06-12-2007, 14:36
Coniaric
 Registrierter Benutzer
Links : Onlinestatus : Coniaric ist offline
Registriert seit: Apr 2004
Beiträge: 324
Coniaric ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ach, noch eine Frage, nur zur Sicherheit:

Gibt es eine Möglichkeit

if($a=="haus" || $a=="HaUs" || $a=="HAUS" ...)

eleganter zu lösen?
Also ich meine, daß $a Haus ist, ganz gleich welchen Case die Buchstaben haben?

EDIT:

Okay, mir ist gerade noch eingefallen, man könnte natürlich den Case vorher ändern: strtolower($a);
Aber gibt es was, um IF-Funktionen zu sagen, daß der Case egal ist?

Mit Zitat antworten
  #14 (permalink)  
Alt 06-12-2007, 14:38
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

PHP-Code:
if( strtolower$a )=='haus' 
oder strcasecmp
Mit Zitat antworten
  #15 (permalink)  
Alt 06-12-2007, 14:44
Coniaric
 Registrierter Benutzer
Links : Onlinestatus : Coniaric ist offline
Registriert seit: Apr 2004
Beiträge: 324
Coniaric ist zur Zeit noch ein unbeschriebenes Blatt
Standard

strtolower siehe Edit.... was ist strcasemp? Der Link geht nicht... liegt das vielleicht daran, daß heute das Manual garnicht geht??
__________________
Gruß, Coni
~~ codito ergo sum - ich code, also bin ich! ~~
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 14:23 Uhr.