Problem mit Perl bzw. LibXML

ClausVB

Registered User
Ich möchte eine einfache Ausgabe einer XML-Datei mit Perl erzeugen. Später soll diese dann in SSI-Dateien verwandelt werden, aber das ist erst der zweite Schritt.

Code:
<?xml version="1.0" encoding="UTF-8"?>
<rubrik0>
  <externer_hyperlink></externer_hyperlink>
  <verzeichnis>/cms200/aktuelles</verzeichnis>
  <name_der_rubrik>Aktuelles</name_der_rubrik>
    <rubrik1>
      <externer_hyperlink></externer_hyperlink>
      <verzeichnis>/cms200/aktuelles/hinweise</verzeichnis>
      <name_der_rubrik>Aktuelle Hinweise</name_der_rubrik>
      <externer_hyperlink></externer_hyperlink>
      <verzeichnis>/cms200/aktuelles/pressemitteilungen</verzeichnis>
      <name_der_rubrik>Pressemitteilungen</name_der_rubrik>
        <rubrik2>
          <externer_hyperlink></externer_hyperlink>
          <verzeichnis>/cms200/aktuelles/pressemitteilungen/2009</verzeichnis>
          <name_der_rubrik>Pressearchiv 2009</name_der_rubrik>
          <externer_hyperlink></externer_hyperlink>
          <verzeichnis>/cms200/aktuelles/pressemitteilungen/2008</verzeichnis>
          <name_der_rubrik>Pressearchiv 2008</name_der_rubrik>
          <externer_hyperlink></externer_hyperlink>
          <verzeichnis>/cms200/aktuelles/pressemitteilungen/2007</verzeichnis>
          <name_der_rubrik>Pressearchiv 2007</name_der_rubrik>
          <externer_hyperlink></externer_hyperlink>
          <verzeichnis>/cms200/aktuelles/pressemitteilungen/2006</verzeichnis>
          <name_der_rubrik>Pressearchiv 2006</name_der_rubrik>
        </rubrik2>
      <externer_hyperlink></externer_hyperlink>
      <verzeichnis>/cms200/aktuelles/termine</verzeichnis>
      <name_der_rubrik>Termine</name_der_rubrik>
        <rubrik2>
          <externer_hyperlink></externer_hyperlink>
          <verzeichnis>/cms200/aktuelles/termine/ks</verzeichnis>
          <name_der_rubrik>Kreistagssitzungen</name_der_rubrik>
          <externer_hyperlink></externer_hyperlink>
          <verzeichnis>/cms200/aktuelles/termine/ska</verzeichnis>
          <name_der_rubrik>Sitzungen Kreisausschüsse</name_der_rubrik>
          <externer_hyperlink></externer_hyperlink>
          <verzeichnis>/cms200/aktuelles/termine/sk</verzeichnis>
          <name_der_rubrik>Sitzungskalender</name_der_rubrik>
          <externer_hyperlink></externer_hyperlink>
          <verzeichnis>/cms200/aktuelles/termine/fk_2005</verzeichnis>
          <name_der_rubrik>Ferienkalender</name_der_rubrik>
        </rubrik2>
      <externer_hyperlink></externer_hyperlink>
      <verzeichnis>/cms200/aktuelles/stellenboerse</verzeichnis>
      <name_der_rubrik>Stellenbörse</name_der_rubrik>
        <rubrik2>
          <externer_hyperlink></externer_hyperlink>
          <verzeichnis>/cms200/aktuelles/stellenboerse/as</verzeichnis>
          <name_der_rubrik>Aktuelle Stellenangebote</name_der_rubrik>
          <externer_hyperlink></externer_hyperlink>
          <verzeichnis>/cms200/aktuelles/stellenboerse/links</verzeichnis>
          <name_der_rubrik>Links</name_der_rubrik>
        </rubrik2>
      <externer_hyperlink></externer_hyperlink>
      <verzeichnis>/cms200/aktuelles/oeffentliche_ausschreibungen</verzeichnis>
      <name_der_rubrik>Öffentliche Ausschreibungen</name_der_rubrik>
      <externer_hyperlink></externer_hyperlink>
      <verzeichnis>/cms200/aktuelles/amadobk</verzeichnis>
      <name_der_rubrik>Aktuelle Medienmeldungen</name_der_rubrik>
    </rubrik1>
</rubrik0>

Das Perl-Skript

Code:
#!/bin/perl -w

use strict;
use XML::LibXML;

my $datei = 'xml_beispiel_datei.xml';
my $mein_objekt = XML::LibXML->new();
my $Baumobjekt = $mein_objekt->parse_file($datei);
my $wurzel = $Baumobjekt->getDocumentElement;
my @knoten = $wurzel->getElementsByTagName('rubrik0');

foreach my $einzelne_knoten (@knoten)
{
	my $name_des_knotens = $einzelne_knoten->getName();
	my $inhalt_des_knotens = $einzelne_knoten->textContent;

	if ($name_des_knotens ne '')
	{
		print "$name_des_knotens = $inhalt_des_knotens\n";
	}
}

gibt nichts aus.

Ändere ich den Wert "rubrik0" auf "rubrik1" werden wenigstens die Unterrubriken (also "rubrik1" und rubrik2") ausgegeben.

Ich benötige bei der Ausgabe jedoch alle Werte.

Mit "perl xml" habe ich gegoogelt und mir folgende Seiten angesehen:
1. infos24 Perl ->XML auslesen mit Perl
2. infos24 xml, xsl, xpath > Auslesen einer XML Datei mit dem Perl Modul XML::LIBXML
3. XML.com: Perl XML Quickstart: The Perl XML Interfaces

Hinweis: Mein Ansatz ist dem in Nummer 2 ähnlich.

Danke und Gruß
Claus
 
Die Lösung ist ganz einfach: rubrik0 ist ja das Wurzelelement des Dokuments. Das holst Du Dir ja schon mittels "my $wurzel = $Baumobjekt->getDocumentElement;". Danach suchst Du nach rubrik0 "unterhalb" des Wurzelknotens. Und das gibt es nicht...

Es reicht als, einfach
Code:
#!/bin/perl -w

use strict;
use XML::LibXML;

my $datei = 'bsp.xml';
my $mein_objekt = XML::LibXML->new();
my $Baumobjekt = $mein_objekt->parse_file($datei);
my $wurzel = $Baumobjekt->getDocumentElement;

my $name = $wurzel->getName();
my $inhalt = $wurzel->textContent();

print "$name = $inhalt";
zu machen.

Gruß,
Renée


--
Perl-Magazin: $foo - Perl-Magazin/Perl-Zeitschrift (Workshops, Module, News und vieles mehr)
Perl-Nachrichten: PerlNews - Deutschsprachige Perl-News
 
Vielen, vielen Dank!

Ich brauche die Zeilen in einem Array, weil ich sie einzeln verarbeiten muss, aber das habe ich dann selbst hinbekommen.

Falls es von allgemeinem Interesse ist, hier der Code:

Code:
#!/bin/perl -w

use strict;
use XML::LibXML;

# Perl trim function to remove whitespace from the start and end of the string
sub trim($)
{
	my $string = shift;
	$string =~ s/^\s+//;
	$string =~ s/\s+$//;
	return $string;
}


my $datei = 'xml_beispiel_datei.xml';
my $mein_objekt = XML::LibXML->new();
my $baumobjekt = $mein_objekt->parse_file($datei);
my $wurzel = $baumobjekt->getDocumentElement;

my $name = $wurzel->getName();
my $inhalt = $wurzel->textContent();

#print "$name = $inhalt";

my @inhalt_als_array = split(/\n/, $inhalt);

for (@inhalt_als_array)
{
	my $inhalt_ohne_leerzeichen = trim($_);

	if ($inhalt_ohne_leerzeichen ne '')
	{
		print 'Inhalt: ' . $inhalt_ohne_leerzeichen . ', ';
	}
}

Danke und Gruß
Claus
 
Das ursprüngliche Skript gibt aus:
Code:
rubrik0 =
  http://ix.de
  /cms200/aktuelles
  Aktuelles

Demnach sind alle Informationen in "$inhalt" gespeichert, also auch die tiefen Ebenen, wie

Code:
<verzeichnis>/cms200/aktuelles/pressemitteilungen/2009</verzeichnis>
oder
<verzeichnis>/cms200/aktuelles/amadobk</verzeichnis>

Gibt es irgendeine Möglichkeit
- zu wissen in welcher Ebene/Rubrik ich bin?
- folgendes auszugeben:

Code:
rubrik0 =
  externer_hyperlink: http://ix.de
  verzeichnis: /cms200/aktuelles
  name_der_rubrik: Aktuelles

So, das ich in der FOR-Schleife prüfen kann, wo ich gerade bin?

Danke und Gruß
Claus
 
Back
Top