[PERL] XML > SQL probleem

Pagina: 1
Acties:

  • HekkeySE
  • Registratie: Maart 2000
  • Niet online
Ik ben bezig om in perl een script te maken dat een xml file inleest en wegschrijft naar mysql (Sql)
1x per dag moet er namelijk een xml dump worden ingelezen van uit een oracle database en weggeschreven worden naar een mysql database. RTG kan dit bestand dan opnieuw inlezen en snmp verzoeken naar nieuwe routers sturen.

Ik heb het volgende script gemaakt en de volgende xml dump maar het werkt niet :'(

test.pl:
#!/usr/bin/perl
use strict;
use DBI;
use XML::XPath;
use XML::XPath::XMLParser;

my $dbh = DBI->connect ("DBI:mysql:xml", "login", "password", { RaiseError => 1, PrintError => 0});
my $xp = XML::XPath->new (filename => "test.xml");
my $nodelist = $xp->find ("//row");
foreach my $row ($nodelist->get_nodelist ())
{
$dbh->do ("INSERT INTO xmltest (LIN_ID, IP_ADDRESS, AANSLUIT_POORT) VALUES (?,?)",
undef,
$row->find ("LIN_ID")->string_value (),
$row->find ("IP_ADDRESS")->string_value (),
$row->find ("AANSLUIT_POORT")->string_value (),
);
}
$dbh->disconnect ();

test.xml:

<?xml version="1.0" encoding="UTF-8"?><database><row><LIN_ID>4646346</LIN_ID><IP_ADDRESS>45345435</IP_ADDRESS><AANSLUIT_POORT>1231412</AANSLUIT_POORT></row></select></database>


De fout:

xml processing instruction not at start of external entity at line 1, column 2, byte 2:
<?xml version="1.0" encoding="UTF-8" ?>
=^
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" />
- <ROWSET>
at /usr/lib/perl5/site_perl/i386-linux/XML/Parser.pm line 187

Weet iemand wat hier niet goed gaat? Heb al zitten googelen maar niks gevonden :'(

Recht op morgen heb ik niet, maar morgen wordt beter dan vandaag en gisteren bestaat niet.


  • Rickets
  • Registratie: Augustus 2001
  • Niet online

Rickets

Finger and a shift

Je test.xml is sowieso al niet well-formed, probeer dat eerst maar eens.

If some cunt can fuck something up, that cunt will pick the worst possible time to fucking fuck it up, because that cunt’s a cunt.


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Je opent de select tag niet in je xml?

Who is John Galt?


  • HekkeySE
  • Registratie: Maart 2000
  • Niet online
justmental schreef op 25 februari 2004 @ 09:16:
Je opent de select tag niet in je xml?
Dit is de originele xml dump...die test.xml had ik zelf even gemaakt. Maar deze originele dump doet het ook niet :( Volgens w3schools ziet het er goed uit (http://www.w3schools.com/xml/cd_catalog.xml)

<?xml version="1.0" encoding="ISO-8859-1" ?>
- <ROWSET>
- <ROW num="1">
<LIN_ID>&&&&&</LIN_ID>
<IP_ADDRESS>&&&&/</IP_ADDRESS>
<AANSLUIT_POORT>&&&&</AANSLUIT_POORT>
</ROW>
</ROWSET>

Recht op morgen heb ik niet, maar morgen wordt beter dan vandaag en gisteren bestaat niet.


  • Rickets
  • Registratie: Augustus 2001
  • Niet online

Rickets

Finger and a shift

Waarschijnlijk staat er 1 of andere char voor de processing instruction. Je moet er dus voor zorgen dat de processing instruction helemaal bovenaan staat (zonder spatie/newline ervoor)

If some cunt can fuck something up, that cunt will pick the worst possible time to fucking fuck it up, because that cunt’s a cunt.


  • HekkeySE
  • Registratie: Maart 2000
  • Niet online
Rickets schreef op 25 februari 2004 @ 09:38:
Waarschijnlijk staat er 1 of andere char voor de processing instruction. Je moet er dus voor zorgen dat de processing instruction helemaal bovenaan staat (zonder spatie/newline ervoor)
De processing instruction staat volgens mij bovenaan en zonder een newline ervoor? (Daar had ik al rekening mee gehouden omdat hij het anders niet kan uitlezen).

Recht op morgen heb ik niet, maar morgen wordt beter dan vandaag en gisteren bestaat niet.


  • Rickets
  • Registratie: Augustus 2001
  • Niet online

Rickets

Finger and a shift

Het streepje voor <rowset> is ook niet geldig. Als dat het ook niet is, weet ik het ook niet meer; het is gewoon gokwerk op deze manier. Zorg ervoor dat je 100% zeker weet dat alle XML-bestanden die je gebruikt in orde zijn.
Btw, ik zie <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" /> in je foutmelding staan, maar niet in je originele dump. Waar komt dat vandaan?

If some cunt can fuck something up, that cunt will pick the worst possible time to fucking fuck it up, because that cunt’s a cunt.


  • HekkeySE
  • Registratie: Maart 2000
  • Niet online
Rickets schreef op 25 februari 2004 @ 09:52:
Het streepje voor <rowset> is ook niet geldig. Als dat het ook niet is, weet ik het ook niet meer; het is gewoon gokwerk op deze manier. Zorg ervoor dat je 100% zeker weet dat alle XML-bestanden die je gebruikt in orde zijn.
Btw, ik zie <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" /> in je foutmelding staan, maar niet in je originele dump. Waar komt dat vandaan?
Ok heb het script werkend maar hij insert nog niks in de database

Correcte xml file:

<?xml version = '1.0'?>
<ROWSET>
<ROW num="1">
<LIN_ID>111</LIN_ID>
<IP_ADDRESS>111</IP_ADDRESS>
<AANSLUIT_POORT>111</AANSLUIT_POORT>
</ROW>
<ROW num="2">
<LIN_ID>1111</LIN_ID>
<IP_ADDRESS>111</IP_ADDRESS>
<AANSLUIT_POORT>111</AANSLUIT_POORT>
</ROW>
<ROW num="3">
<LIN_ID>111</LIN_ID>
<IP_ADDRESS>111</IP_ADDRESS>
<AANSLUIT_POORT>111</AANSLUIT_POORT>
</ROW>
</ROWSET>

Veranderd perl script:

#!/usr/bin/perl
use strict;
use DBI;
use XML::XPath;
use XML::XPath::XMLParser;

my $dbh = DBI->connect ("DBI:mysql:xml", "bla", "bla", { RaiseError => 1, PrintError => 0});
my $xp = XML::XPath->new (filename => "test.xml");
my $nodelist = $xp->find ("//row");
foreach my $row ($nodelist->get_nodelist ())
{
$dbh->do ("INSERT INTO xmltest (LIN_ID, IP_ADDRESS, AANSLUIT_POORT) VALUES (?,?,?)",
undef,
$row->find ("LIN_ID")->string_value (),
$row->find ("IP_ADDRESS")->string_value (),
$row->find ("AANSLUIT_POORT")->string_value (),
);
}
$dbh->disconnect ();

[ Voor 17% gewijzigd door HekkeySE op 25-02-2004 10:10 ]

Recht op morgen heb ik niet, maar morgen wordt beter dan vandaag en gisteren bestaat niet.


  • bartware
  • Registratie: Juni 2001
  • Laatst online: 25-03-2023

bartware

@jabber.org

Als je een print van de query doet, is die dan wel goed?

Heb ik me begrepen?
Cycle Vision 2020: 17-20 juli Sportpark Sloten & Wheelerplanet Spaarnwoude


  • HekkeySE
  • Registratie: Maart 2000
  • Niet online
bartware schreef op 25 februari 2004 @ 10:22:
Als je een print van de query doet, is die dan wel goed?
Yup dat doet het....waarschijnlijk is er iets fouts bij het importeren de xml file maar wat? :?

Recht op morgen heb ik niet, maar morgen wordt beter dan vandaag en gisteren bestaat niet.


  • bartware
  • Registratie: Juni 2001
  • Laatst online: 25-03-2023

bartware

@jabber.org

Ik bedoelde meer: hoe ziet de query die wordt opgebouwd eruit?
Als je die afdrukt krijg je wellicht inzicht in waar het fout gaat.

Heb ik me begrepen?
Cycle Vision 2020: 17-20 juli Sportpark Sloten & Wheelerplanet Spaarnwoude


  • JQR
  • Registratie: Augustus 2001
  • Laatst online: 20-05 22:43

JQR

en kun je misschien je perl tussen code-tags zetten?? leest wat fijner :)

  • HekkeySE
  • Registratie: Maart 2000
  • Niet online
bartware schreef op 25 februari 2004 @ 10:46:
Ik bedoelde meer: hoe ziet de query die wordt opgebouwd eruit?
Als je die afdrukt krijg je wellicht inzicht in waar het fout gaat.
Ik heb nu toegevoegd als hij wat in het xml document ziet dat hij het ook laat zien op het scherm. Zoals het er nu uitziet pikt hij niks uit het xml document.

Code tags gedaan, sorry

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/perl
use strict;
use DBI;
use XML::XPath;
use XML::XPath::XMLParser;

my $row;
my $query;
my $sth;
my $dbh = DBI->connect ("DBI:mysql:xml", "user", "pass", { RaiseError => 1, PrintError => 0});
my $xp = XML::XPath->new (filename => "test.xml");
my $nodelist = $xp->find ("ROW");

print $nodelist . "\n";

foreach $row ($nodelist->get_nodelist ()) {
    print "Ik heb wat!\n";

    $query  = "INSERT INTO xmltest (LIN_ID, ";
    $query .=                      "IP_ADDRESS, ";
    $query .=                      "AANSLUIT_POORT, ";
    $query .= ") ";
    $query .= "VALUES (" . $row->find ("LIN_ID")->string_value () . ", ";
    $query .=              $row->find ("IP_ADDRESS")->string_value () . ", ";
    $query .=              $row->find ("AANSLUIT_POORT")->string_value (); 
    $query .= ")";

    $sth = $dbh->prepare ($query);
    $sth->execute();
    $sth->finish();
}

$dbh->disconnect ();


code:
1
2
3
4
5
6
7
8
<?xml version = '1.0'?>
<ROWSET>
<ROW>
<LIN_ID>jfjfgjh</LIN_ID>
<IP_ADDRESS>45645645</IP_ADDRESS>
<AANSLUIT_POORT>LAN2.2</AANSLUIT_POORT>
</ROW>
</ROWSET>

[ Voor 30% gewijzigd door HekkeySE op 25-02-2004 11:08 ]

Recht op morgen heb ik niet, maar morgen wordt beter dan vandaag en gisteren bestaat niet.


  • HekkeySE
  • Registratie: Maart 2000
  • Niet online
Het werkt!!!!

Alleen nu voert hij alles in, nu moet hij controleren of het al bestaat anders blijft hij de database vullen met dezelfde data ;)

code:
1
2
3
4
5
6
7
8
9
10
11
mysql> select * from xmltest;
+------------------+-------------+----------------+
| lin_id           | ip_address  | aansluit_poort |
+------------------+-------------+----------------+
| inhoud1 | inhoud2 | inhoud3        |
| inhoud1 | inhoud2 | inhoud3        |
| inhoud1 | inhoud2 | inhoud3        |
| inhoud1 | inhoud2 | inhoud3        |
| inhoud1 | inhoud2 | inhoud3        |
+------------------+-------------+----------------+
5 rows in set (0.00 sec)


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/perl
use strict;
use DBI;
use XML::XPath;
use XML::XPath::XMLParser;
use Data::Dumper;

my $row;
my $query;
my $sth;
my $dbh = DBI->connect ("DBI:mysql:xml", "user", "pass", { RaiseError => 1, PrintError => 0});
my $xp = XML::XPath->new (filename => "test.xml");
my $nodelist = $xp->find ("ROWSET/ROW");

# print $nodelist . "\n";
print "Het werkt!\n";

foreach my $row ($nodelist->get_nodelist ()) 
{

#       print Dumper($row);
#       print "Ik heb wat!\n";
    
    $dbh->do ("INSERT INTO xmltest (LIN_ID, IP_ADDRESS, AANSLUIT_POORT) VALUES (?,?,?)",
    undef,
        $row->find ("LIN_ID")->string_value (),
        $row->find ("IP_ADDRESS")->string_value (),
        $row->find ("AANSLUIT_POORT")->string_value (),
    );
}
$dbh->disconnect ();


code:
1
2
3
4
5
6
7
8
<?xml version = '1.0'?>
<ROWSET>
<ROW>
<LIN_ID>inhoud1</LIN_ID>
<IP_ADDRESS>inhoud2</IP_ADDRESS>
<AANSLUIT_POORT>inhoud3</AANSLUIT_POORT>
</ROW>
</ROWSET>

Recht op morgen heb ik niet, maar morgen wordt beter dan vandaag en gisteren bestaat niet.


  • bartware
  • Registratie: Juni 2001
  • Laatst online: 25-03-2023

bartware

@jabber.org

Gelukkig deed ik nog een refresh.
Wou net vragen of die $xp->find (ROW) wel goed was, xpath technisch gezien... :)

Mooi dat het werkt.

Heb ik me begrepen?
Cycle Vision 2020: 17-20 juli Sportpark Sloten & Wheelerplanet Spaarnwoude


  • HekkeySE
  • Registratie: Maart 2000
  • Niet online
bartware schreef op 25 februari 2004 @ 12:02:
Gelukkig deed ik nog een refresh.
Wou net vragen of die $xp->find (ROW) wel goed was, xpath technisch gezien... :)

Mooi dat het werkt.
Weet je toevallig ook uit je hoeft dat hij check doet of het al bestaat en zo ja dat het hij het update of naar het volgende veld gaat? ;)

Recht op morgen heb ik niet, maar morgen wordt beter dan vandaag en gisteren bestaat niet.


  • bartware
  • Registratie: Juni 2001
  • Laatst online: 25-03-2023

bartware

@jabber.org

Nee, je zult zelf aan de DB moeten vragen of een record met LIN_ID al bestaat natuurlijk. En a.d.h. daarvan een update of een insert doen.

Heb ik me begrepen?
Cycle Vision 2020: 17-20 juli Sportpark Sloten & Wheelerplanet Spaarnwoude

Pagina: 1