xml => mysql

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • xml => mysql

    einen fröhlichen ...

    im rahmen meiner praktikumsarbeit muß ich eine xml-datei in eine mysql rüberschieben. soll alles so flexibel gehandelt werden, das der script universell einsetzbar ist. es gibt immer eine dtd. die habe ich nun endlich so auseinandernehmen können, das mir schon mal die tabellen angelegt werden. die dtd mußte deshalb herhalten, weil es zu einer dtd mehrere xml geben kann. das vorab zur erklärung. nun häng ich schon seit tagen vor der xml-datei und stiere mir die augen aus dem kopf, weil ich die nicht gescheit geparst bekomme. vielleicht kann mir ja hier wer weiterhelfen ... *hoff*

    die xml

    Code:
    <?xml version="1.0" encoding="iso-8859-1"?>
    <!DOCTYPE AuthorityData SYSTEM "firma.dtd">
    <AuthorityData>
            <Tasks>
                    <Task> Aufgabe 1der Firma</Task>
                    <Task> Aufgabe 2der Firma</Task>
            </Tasks>
             <Adress>
                    <Name> Name der Firma</Name>
                    <ZipCode>PLZ</ZipCode>
                    <PostOfficeBox>Postfach</PostOfficeBox>
                    <City>Stadtname</City>
            </Adress>
            <Adress>
                    <Name> Name der Firma </Name>
                    <Street>Strassenname</Street>
                    <Number>Strassennummer</Number>
                    <ZipCode>PLZ</ZipCode>
                    <City>Stadtname</City>
                    <Tel>8888</Tel>
                    <Fax>9999</Fax>
                    <eMail>info@xxx.de</eMail>
                    <Website>[url]www.xxx.de[/url]</Website>
                    <OpeningHours>
                            <OpeningTupel>
                                    <date>Di</date>
                                    <hours>9:00 - 12:00 Uhr und 14:00 - 18:00 Uhr</hours>
                            </OpeningTupel>
                            <OpeningTupel>
                                    <date>Do</date>
                                    <hours>9:00 - 12:00 Uhr und 13:00 - 15:00 Uhr</hours>
                            </OpeningTupel>
                    </OpeningHours>
                    <ContactPerson>
                            <Show>true</Show>
                            <Calling>Frau</Calling>
                            <Title>Dr.</Title>
                            <GivenName>Anna</GivenName>
                            <FamilyName>Ehmke</FamilyName>
                            <Function>Sachbearbeiterin</Function>
                            <Tel>8888</Tel>
                            <Fax>8888</Fax>
                            <eMail>info@xxx.de</eMail>
                            <Tasks>
                                    <Task>Aufgabe 1 der Kontaktperson</Task>
                                    <Task>Aufgabe 2 der Kontaktperson</Task>
                            </Tasks>
                            <Tasks>
                                    <Task>Anmeldung von Hunden</Task>
                            </Tasks>
                            <ServiceContact>
                                    <ServiceOid oid="3301"> Hund anmelden</ServiceOid>
                            </ServiceContact>
                    </ContactPerson>
            </Adress>
    </AuthorityData>
    die dtd

    Code:
    <!ELEMENT Adress (Name?, Street?, Number?, ZipCode?, PostOfficeBox?, City?, Tel?, Fax?, eMail?, Website?, OpeningHours?, ContactPerson?)*>
    <!ELEMENT AuthorityData (Tasks?, Adress*)*>
    <!ELEMENT Calling (#PCDATA)>
    <!ELEMENT City (#PCDATA)>
    <!ELEMENT ContactPerson (Show?, Calling?, Title?, GivenName?, FamilyName?, Function?, Tel?, Fax?, eMail?, Tasks*, ServiceContact?)*>
    <!ELEMENT FamilyName (#PCDATA)>
    <!ELEMENT Fax (#PCDATA)>
    <!ELEMENT Function (#PCDATA)>
    <!ELEMENT GivenName (#PCDATA)>
    <!ELEMENT Name (#PCDATA)>
    <!ELEMENT Number (#PCDATA)>
    <!ELEMENT OpeningHours (OpeningTupel*)*>
    <!ELEMENT OpeningTupel (date, hours)*>
    <!ELEMENT PostOfficeBox (#PCDATA)>
    <!ELEMENT ServiceContact (ServiceOid*)*>
    <!ELEMENT ServiceOid (#PCDATA)>
    <!ATTLIST ServiceOid
            oid CDATA #REQUIRED
    >
    <!ELEMENT Show (#PCDATA)>
    <!ELEMENT Street (#PCDATA)>
    <!ELEMENT Task (#PCDATA)>
    <!ELEMENT Tasks (Task*)*>
    <!ELEMENT Tel (#PCDATA)>
    <!ELEMENT Title (#PCDATA)>
    <!ELEMENT Website (#PCDATA)>
    <!ELEMENT ZipCode (#PCDATA)>
    <!ELEMENT date (#PCDATA)>
    <!ELEMENT eMail (#PCDATA)>
    <!ELEMENT hours (#PCDATA)>
    bis denne

    megle


    EDIT:
    code.tags by Abraxax
    sonst stieren sich nämlich andere user auch die augen aus dem kopf.

    Zuletzt geändert von Abraxax; 19.08.2003, 11:19.

  • #2
    Fehlermeldung? Zeile?
    Yuppi, endlich Elite ...

    Kommentar


    • #3
      es gibt noch keinen fehler, ich grübel immer noch über dem lösungsansatz ... es ist mir bisher nur gelungen, die entsprechend benötigten tabellen anlegen zu lassen durch parsen der dtd. nun grübel ich darüber, wie ich die xml da rein bekomme.

      Kommentar


      • #4
        vielleicht hilft es ja weiter, wenn ich schon mal mein code-schnippsel für die dtd poste ...

        Code:
        function dtdParsen() {
        	global $c_dtdname, $c_lokalerpfad_relativ, $i_aktzeit, $r_sqlhandle, $c_datenbank, $a_felderliste, $a_tabellenliste;
        	$a_tabellenparameter = array();
        	$a_query_create_table = array();
        	$c_dtddatei = $c_lokalerpfad_relativ . $c_dtdname;
        	$r_meinfilehandler = fopen( $c_dtddatei , r );
        	$c_inhalt = fread( $r_meinfilehandler , filesize( $c_dtddatei ) + 100 );
        	fclose($r_meinfilehandler);
        	$a_dtd = explode("<" , $c_inhalt);
        #	$a_dtdbereinigt = array();
        	for( $i = 0 ; $i < count( $a_dtd ) ; $i++ ) {
        		if ( substr($a_dtd[$i],0,5) == "!ELEM" || substr($a_dtd[$i],0,5) == "!ATTL") {
        			if ( substr($a_dtd[$i],0,5) == "!ELEM" ) {
        				$a_dtd[$i] = substr($a_dtd[$i],9,strlen($a_dtd[$i]));
        				$c_name = substr($a_dtd[$i],0,strpos($a_dtd[$i]," "));
        				$c_parameter = str_replace(" ","",substr($a_dtd[$i] , strpos($a_dtd[$i],"(") + 1 , strpos($a_dtd[$i],")") - strpos($a_dtd[$i],"(") - 1) );
        				if( substr($c_parameter,0,7) == "#PCDATA" ) {
        					$a_paramter = explode(",",$c_parameter);
        					$neu = array_push( $a_felderliste , $c_name);
        				} else {
        					$neu = array_push( $a_tabellenparameter , $c_parameter);
        					$neu = array_push( $a_tabellenliste , $c_name);
        				}
        			}
        #			$neu = array_push( $a_dtdbereinigt , $a_dtd[$i]);
        		}	
        	}
        /*
         Startelement entfernen
         */
        	for( $i = 0 ; $i < count( $a_tabellenliste ) ; $i++ ) {
        		$c_tabellenname = $a_tabellenliste[$i];
        		$b_gefunden = FALSE;
        		for( $n = 0 ; $n < count( $a_tabellenparameter ) ; $n++ ) {
        			if ( strlen( stristr( $a_tabellenparameter[$n], $a_tabellenliste[$i]) ) > 0 ) {
        				$b_gefunden = TRUE;
        			}
        		}
        		if ( !$b_gefunden ) {
        			unset( $a_tabellenliste[$i] );
        			$i_gefunden = $i;
        		}
        	}
        	unset( $a_tabellenparameter[$i_gefunden] );
        	$a_tabellenliste = array_values($a_tabellenliste);
        	$a_tabellenparameter = array_values($a_tabellenparameter);
        	
        	echo "<pre>\n";
        	print "tabellenliste<br>";
        	print_r( $a_tabellenliste);
        	print "tabellenparameter<br>";
        	print_r( $a_tabellenparameter);
        #	print "felderliste<br>";
        #	print_r( $a_felderliste);
        	echo "</pre>\n";
        
        /*
         CREATE TABLES generieren und in Array schieben
         */
        
        	for( $i = 0 ; $i < count( $a_tabellenliste ) ; $i++ ) {
        		$c_meindtd = str_replace(".dtd", "" , $c_dtdname);
        		$c_meindtd = str_replace($i_aktzeit, "" , $c_meindtd);
        		$c_query = "CREATE TABLE `" . $c_meindtd . "_" . $a_tabellenliste[$i] . "` ( ";
        		$c_query .= "`id` int(11) NOT NULL auto_increment";
        		$a_tabellenfelder = explode(",", $a_tabellenparameter[$i]);
        		for( $f = 0 ; $f < count( $a_tabellenfelder ) ; $f++ ) {
        			if ( strpos($a_tabellenfelder[$f],"?") > 0 ) {
        				$a_tabellenfelder[$f] = str_replace("?","",$a_tabellenfelder[$f]);
        				if ( !in_array($a_tabellenfelder[$f],$a_felderliste ) ){
        					$c_query .= ",`$a_tabellenfelder[$f]` int(11)";
        				} else {
        					$c_query .= ",`$a_tabellenfelder[$f]` varchar(255) default ''";
        				}
        			} else if ( ( strpos($a_tabellenfelder[$f],"*") > 0 ) || ( strpos($a_tabellenfelder[$f],"+") > 0 ) ) {
        				$a_tabellenfelder[$f] = str_replace("*","",$a_tabellenfelder[$f]);
        				$a_tabellenfelder[$f] = str_replace("+","",$a_tabellenfelder[$f]);
        				if ( !in_array( $a_tabellenfelder[$f] , $a_felderliste ) ) {
        					$c_query_schluessel = "CREATE TABLE `" . $c_meindtd . "_" . $a_tabellenliste[$i] . "_" . $a_tabellenfelder[$f] . "` ( ";
        					$c_query_schluessel .= "`id` int(11) NOT NULL auto_increment";
        					$c_query_schluessel .= ",`$a_tabellenliste[$i]` int(11)";
        					$c_query_schluessel .= ",`$a_tabellenfelder[$f]` int(11)";
        					$c_query_schluessel .= ",PRIMARY KEY  (`id`) );";				
        					$neu = array_push( $a_query_create_table , $c_query_schluessel);
        				} else {
        					if ( !in_array($a_tabellenfelder[$f],$a_felderliste ) ){
        						$c_query .= ",`$a_tabellenfelder[$f]` int(11)";
        					} else {
        						$c_query .= ",`$a_tabellenfelder[$f]` varchar(255) default ''";
        					}
        				}
        			} else {
        				if ( !in_array($a_tabellenfelder[$f],$a_felderliste ) ){
        					$c_query .= ",`$a_tabellenfelder[$f]` int(11)";
        				} else {
        					$c_query .= ",`$a_tabellenfelder[$f]` varchar(255) default ''";
        				}
        			}
        		}
        		$c_query .= ",PRIMARY KEY  (`id`) );";
        		$neu = array_push( $a_query_create_table , $c_query);
        	}
        	echo "<pre>\n";
        	print_r( $a_query_create_table);
        	echo "</pre>\n";
        /*
         Tabellenliste holen und bei nichtvorhandensein die Tabellen anlegen
         */
        	$a_vorhandenetabellen = array();
        	mysql_selectdb($c_datenbank, $r_sqlhandle);
        	$r_tabellenliste = mysql_listtables($c_datenbank);
        	while ( $i_t < mysql_num_rows($r_tabellenliste ) ){
        		$neu = array_push($a_vorhandenetabellen,mysql_tablename($r_tabellenliste, $i_t));
        		$i_t++;
        	}
        	for( $i = 0 ; $i < count( $a_query_create_table ) ; $i++ ) {
        		$i_ersteshochkomma = strpos($a_query_create_table[$i],"`",0) + 1;
        		$i_zweiteshochkomma = strpos($a_query_create_table[$i],"`",$i_ersteshochkomma);
        		$c_tabelle = strtolower(substr( $a_query_create_table[$i], $i_ersteshochkomma , $i_zweiteshochkomma - $i_ersteshochkomma));
        		if ( !in_array($c_tabelle,$a_vorhandenetabellen ) ){
        			print "$a_query_create_table[$i] <br><br>";
        			$abfrage = mysql_query($a_query_create_table[$i], $r_sqlhandle);
        			echo mysql_error();
        			echo "<br><br>";
        		} else {
        /*
         Hier muß die bestehende Tabelle noch gecheckt werden, ob evtl. Felder hinzugekommen sind (die DTD wurde geändert)
         */
        			print "Die Tabelle \"$c_tabelle\" existiert schon<br><br>";
        		}		
        	}
        }
        das bringt mir folgende tabellen, und wenn ich so drüber schaue, sollte es auch stimmen ...

        Code:
        Array
        (
            [0] => CREATE TABLE `behoerde_Adress` ( `id` int(11) NOT NULL auto_increment,`Name` varchar(255) default '',`Street` varchar(255) default '',`Number` varchar(255) default '',`ZipCode` varchar(255) default '',`PostOfficeBox` varchar(255) default '',`City` varchar(255) default '',`Tel` varchar(255) default '',`Fax` varchar(255) default '',`eMail` varchar(255) default '',`Website` varchar(255) default '',`OpeningHours` int(11),`ContactPerson` int(11),PRIMARY KEY  (`id`) );
            [1] => CREATE TABLE `behoerde_ContactPerson_Tasks` ( `id` int(11) NOT NULL auto_increment,`ContactPerson` int(11),`Tasks` int(11),PRIMARY KEY  (`id`) );
            [2] => CREATE TABLE `behoerde_ContactPerson` ( `id` int(11) NOT NULL auto_increment,`Show` varchar(255) default '',`Calling` varchar(255) default '',`Title` varchar(255) default '',`GivenName` varchar(255) default '',`FamilyName` varchar(255) default '',`Function` varchar(255) default '',`Tel` varchar(255) default '',`Fax` varchar(255) default '',`eMail` varchar(255) default '',`ServiceContact` int(11),PRIMARY KEY  (`id`) );
            [3] => CREATE TABLE `behoerde_OpeningHours_OpeningTupel` ( `id` int(11) NOT NULL auto_increment,`OpeningHours` int(11),`OpeningTupel` int(11),PRIMARY KEY  (`id`) );
            [4] => CREATE TABLE `behoerde_OpeningHours` ( `id` int(11) NOT NULL auto_increment,PRIMARY KEY  (`id`) );
            [5] => CREATE TABLE `behoerde_OpeningTupel` ( `id` int(11) NOT NULL auto_increment,`date` varchar(255) default '',`hours` varchar(255) default '',PRIMARY KEY  (`id`) );
            [6] => CREATE TABLE `behoerde_ServiceContact` ( `id` int(11) NOT NULL auto_increment,`ServiceOid` varchar(255) default '',PRIMARY KEY  (`id`) );
            [7] => CREATE TABLE `behoerde_Tasks` ( `id` int(11) NOT NULL auto_increment,`Task` varchar(255) default '',PRIMARY KEY  (`id`) );
        )
        und nun muß da nur noch die xml richtig rein. das blöde sind halt die 1-n verbindungen

        bis denne

        megle

        Kommentar


        • #5
          xml(dtd) =&gt; mysql

          hollachens zusammen,

          im rahmen meiner praktikumsarbeit habe ich eine dtd und mehrere xml bekommen, die auf der einen dtd aufbauen. das alles soll nun in eine mysql gebracht werden. den script für die dtd zu parsen und die tabellen anzulegen hab ich schon, vielleicht (bestimmt) verbesserungswürdig. nun such ich noch nach möglichkeiten (script), um die xml auseinander zu nehmen und in die db zu schieben. prob sind hierbei die 1-n verbindungen. die dtd, xml und den dtdparser findet ihr im php-xml forum. mag eigentlich nicht crossposten, kenn aber eure gewohnheiten nicht, wer wann wo in welches forum schaut. vielleicht könnt ihr ja mit lösungsansätzen weiterhelfen.

          bis denne

          megle

          Kommentar


          • #6
            mag eigentlich nicht crossposten, kenn aber eure gewohnheiten nicht, wer wann wo in welches forum schaut.
            und dennoch machst du es...

            *ZUSAMMENFÜHR*

            wenn einer eine lösung für die hat, wird er sich melden. je ausgefallener die probleme sind, umso länger dauert es eben, bis eine antwort kommt. das ist aber normal.
            INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


            Kommentar


            • #7
              @meglepetes

              Hallo,

              bist du bei deinem Problem weitergekommen. Ich stehe an einer ähnlichen Stelle. Kannst du mir sagen wie ich die SQL-Statements aus dem Array dann an die DB gebe und die DAten dann auch übergeben werden?

              Kommentar

              Lädt...
              X