tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
12
ZUGRIFFE
1328
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Dany23 Dany23 ist offline Rookie
    Registriert seit
    Sep 2009
    Beiträge
    6
    Hallo,

    ich beisse mir gerade seit etwa zwei Stunden die Zähne an einem Problem aus und hoffe, dass mir hier jemand helfen kann. Hört sich eigentlich ganz einfach an:

    Ich habe einen String der ein XML Element enthält, aus diesem String möchte ich nun die Attributwerte extrahieren und in einer Variablen speichern. Dachte daran, das mit regulären Ausdrücken zu machen, für jedes Attribut einen. Bekomme das aber leider nicht hin. Kann mir da jemand helfen? Vielleicht hat auch jemand eine Idee wie sie das Problem besser lösen lässt.
    Hier ein Beispiel des Strings:

    product="<product kodierung="A" nummer="100001" produktmerkmal="A" speicherdatum="2004-04-30" speicheruhrzeit="00:00:00"> </product>";

    Ziel soll es nun sein z.B. für die Variable nummer den Wert "100001"
    extrahieren zu können.

    Würde mich über Hilfe freuen.
    Grüße
    Dany
     

  2. #2
    Avatar von chmee
    chmee chmee ist offline mod | media
    tutorials.de Moderator
    Registriert seit
    Apr 2004
    Ort
    Berlin bei Potsdam
    Beiträge
    7.629
    Blog-Einträge
    4
    Würde es nicht schon reichen, wenn Du einfach nur nach nummer=" und " produktmerkmal=" suchst?
    Also als Regex -glaube ich- so : /(?<=nummer=").*(?=" produktmerkmal)/

    Wobei ich mich frage, warum Du nicht die XML-Konventionen nutzt, um die Daten zu erhalten. Aber keine Sorge, hab schon zu Genüge Daten mit Regex geparsed, die mit anderen Techniken effizienter wären

    mfg chmee
     
    Mein Blog - VideoFAQ - FotoFAQ - bei Flickr - DSLR Kleinanzeigen
    Benutzt den DANKE-Knopf oder bewertet den Beitrag

    "GEHT NICHT" HILFT NICHT, TESTET EURE CODES ONLINE UND GEBT KLARE INFOS!
    -> Regexp <- -> php <- -> Javascript <-

  3. #3
    Avatar von DosCoder
    DosCoder DosCoder ist offline Mitglied Gold
    Registriert seit
    Sep 2008
    Ort
    Kreis Würzburg(Bayern)
    Beiträge
    228
    Hi,
    da fallen mir 2 Möglichkeiten ein:
    1) Du suchst dir im String mit Hilfe von indexOf() den Variablennamen, gehst in diesem Unterstring weiter bis zum 1. Gänsefüsschen und liest den Wert bis zum 2.Gänsefüsschen ein. Über den genauen Algorithmus kann man sich jetzt streiten, aber es gibt ja bekanntlich viele Wege.
    2) Du schaust dir mal DOM und SAX an. Diese sind XML-Bibliotheken für Java, mit denen man die Elemente einfach filtern kann.

    Bei weiteren Fragen: Frage einfach!
    Ciao
    DosCoder

    [EDIT]Wieder mal zu langsam...
     
    Man kann mich für das verantwortlich machen, was ich hier schreibe, nicht für das, was andere verstehen.

    Sollte ich mal Mist labern weist mich bitte darauf hin.

    Ich freue mich über ein Danke, wenn ich helfen konnte!

  4. #4
    Dany23 Dany23 ist offline Rookie
    Registriert seit
    Sep 2009
    Beiträge
    6
    Hallo,

    danke für die Antworten.

    @chmee: mit dem regulären Ausdruck finde ich schon nummer=", aber ich möchte ja gerne den Wert in die Variablen speichern. Das bekomme ich nicht hin.

    @DosCoder: Mit der ersten Möglichkeit bekomme ich es hin. War auch mein erster Ansatz aber ich fand es wahnsinnig umständlich und dachte mit den regulären Ausdrücken wäre es eleganter. Die Variante würde ich fertigstellen wenn ich es anders gar nicht mehr hinbekomme.
    Bei der zweiten Variante bin ich mir nicht sicher ob ich nicht mit Kanonen auf Spatzen schiesse. Ich bekomme diesen Datensatz angeliefert in einem XML File und ein Attribut beinhaltet eben diesen Auszug als Wert.
     

  5. #5
    Avatar von chmee
    chmee chmee ist offline mod | media
    tutorials.de Moderator
    Registriert seit
    Apr 2004
    Ort
    Berlin bei Potsdam
    Beiträge
    7.629
    Blog-Einträge
    4
    Naja, ich hab den Regextester benutzt, gibt es etwa unter Java andere Konventionen?
    http://www.regex-tester.de/regex.html

    Als Zweites dachte ich mir, ich such Dir alle "xxx" raus mit /="[^"]*"/ . Das Ergebnis ist ein Array aller Werte, mit diesem Pattern aber noch mit =" und " am Ende. Da müsste man nur das Ergebnisstring beschneiden..

    mfg chmee
     
    Mein Blog - VideoFAQ - FotoFAQ - bei Flickr - DSLR Kleinanzeigen
    Benutzt den DANKE-Knopf oder bewertet den Beitrag

    "GEHT NICHT" HILFT NICHT, TESTET EURE CODES ONLINE UND GEBT KLARE INFOS!
    -> Regexp <- -> php <- -> Javascript <-

  6. #6
    Avatar von DosCoder
    DosCoder DosCoder ist offline Mitglied Gold
    Registriert seit
    Sep 2008
    Ort
    Kreis Würzburg(Bayern)
    Beiträge
    228
    Hi,
    und wie öffnest du die XML-File? Liest du das Ganze als Textdatei ein? Wenn ja, würde ich sagen, dass sich der Umstieg auf SAX oder DOM lohnt. Wenn ich dich jetzt falsch verstanden habe, und es wirklich nur um dieses Element geht, dann würde ich es mit den String-Methoden machen. Den SAX oder DOM bedeuteten, dass du auch immer die Bibliotheken mit deinem Programm herumschleppen musst.
    Ciao
    DosCoder

    [EDIT] Dat gibst ja nicht, schon wieder zu lahm....
     
    Man kann mich für das verantwortlich machen, was ich hier schreibe, nicht für das, was andere verstehen.

    Sollte ich mal Mist labern weist mich bitte darauf hin.

    Ich freue mich über ein Danke, wenn ich helfen konnte!

  7. #7
    Dany23 Dany23 ist offline Rookie
    Registriert seit
    Sep 2009
    Beiträge
    6
    Ich lese das File mit jaxb ein.
    Versuche jetzt nochmal mit:

    java.util.regex.Pattern p = java.util.regex.Pattern.compile( "nummer=\".*\"" );
    Matcher m = p.matcher( "nummer=\"12\"" );

    Allerdings bekomme ich es nicht hin das ich den ganzen String in ein Array gelesen bekomme.
     

  8. #8
    Dany23 Dany23 ist offline Rookie
    Registriert seit
    Sep 2009
    Beiträge
    6
    Also das funktioniert nun, wobei es nicht besonders toll ist:

    Code :
    1
    2
    3
    4
    
    Pattern  p =Pattern.compile( "(?<=nummer=\").*(?=\" produktmerkmal)/" ); 
    Matcher m = p.matcher( "nummer=\"12\"" ); 
    if (m.find())   
    System.out.println("ausgabe: "+m.group().substring(8,m.group().length()-1));

    @chmee kannst Du mir noch einen Hinweis geben wie ich das komplett in ein Array bekomme wie Du vorgeschlagen hast?
     

  9. #9
    Avatar von DosCoder
    DosCoder DosCoder ist offline Mitglied Gold
    Registriert seit
    Sep 2008
    Ort
    Kreis Würzburg(Bayern)
    Beiträge
    228
    Hi,
    was meinst du, mit "den ganzen String in ein Array gelesen bekomme"?
    Außerdem ist in Wikipedia zu lesen, dass JAXP DOM und SAX beinhaltet. Und mit diesen beiden Bibliotheken kann man bequem Attribute auslesen:
    Code java:
    1
    
    String value = new SAXBuilder().build(new InputSource("main/Pfad/zur/XML-Datei.xml")).getRootElement().getAttributeValue("attrib");

    Ciao
    DosCoder
     
    Man kann mich für das verantwortlich machen, was ich hier schreibe, nicht für das, was andere verstehen.

    Sollte ich mal Mist labern weist mich bitte darauf hin.

    Ich freue mich über ein Danke, wenn ich helfen konnte!

  10. #10
    Avatar von chmee
    chmee chmee ist offline mod | media
    tutorials.de Moderator
    Registriert seit
    Apr 2004
    Ort
    Berlin bei Potsdam
    Beiträge
    7.629
    Blog-Einträge
    4
    Ich habe Java leider nie wirklich angefasst. In php gibt es den Befehl preg_match_all($pattern, $string, $array). Das Ergebnis ist ein Array $array, das alle Funde auflistet.

    Das wäre das Pattern für Variablen innerhalb der Anführungszeichen finden, nach php jedenfalls : (?<==")[^"]*(?=")

    mfg chmee
     
    Mein Blog - VideoFAQ - FotoFAQ - bei Flickr - DSLR Kleinanzeigen
    Benutzt den DANKE-Knopf oder bewertet den Beitrag

    "GEHT NICHT" HILFT NICHT, TESTET EURE CODES ONLINE UND GEBT KLARE INFOS!
    -> Regexp <- -> php <- -> Javascript <-

  11. #11
    Dany23 Dany23 ist offline Rookie
    Registriert seit
    Sep 2009
    Beiträge
    6
    Zitat Zitat von DosCoder Beitrag anzeigen
    Hi,
    was meinst du, mit "den ganzen String in ein Array gelesen bekomme"?
    Außerdem ist in Wikipedia zu lesen, dass JAXP DOM und SAX beinhaltet. Und mit diesen beiden Bibliotheken kann man bequem Attribute auslesen:
    Code java:
    1
    
    String value = new SAXBuilder().build(new InputSource("main/Pfad/zur/XML-Datei.xml")).getRootElement().getAttributeValue("attrib");

    Ciao
    DosCoder

    Ja, nur habe ich den Teil den ich zerlegen will ja in einem String und nicht in einer Datei. Auf die restlichen Elemente aus der Datei kann ich direkt zugreifen.
     

  12. #12
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    hier ne weitere Möglichkeit,...
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    package de.tutorials;
     
    public class RegexGroupReferenceExample {
     
        /**
         * @param args
         */
        public static void main(String[] args) {
            String xml = "<product kodierung=\"A\" nummer=\"100001\" produktmerkmal=\"A\" speicherdatum=\"2004-04-30\" speicheruhrzeit=\"00:00:00\"> </product>";
            
            System.out.println(extract("nummer",xml));
            System.out.println(extract("produktmerkmal",xml));
            System.out.println(extract("speicherdatum",xml));
        }
     
        private static String extract(String attributeName, String xml) {
            return xml.replaceAll(".*" + attributeName + "\\s*=\"([^\"]*)\".*", "$1");
        }
    }

    Ausgabe:
    Code :
    1
    2
    3
    
    100001
    A
    2004-04-30

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  13. #13
    Dany23 Dany23 ist offline Rookie
    Registriert seit
    Sep 2009
    Beiträge
    6
    Hallo,

    euch allen vielen Dank für die Unterstützung.

    Tom, Deine Lösung sieht auf den ersten Blick genauso aus wie ich es mir vorgestellt habe.

    Hatte es am Ende so realisiert:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    public static String getValue(String attribute, String document){
            String value = "";
            String regex = attribute + "=\".*?\"";
            java.util.regex.Pattern pattern = java.util.regex.Pattern.compile(regex);
            Matcher m1 = pattern.matcher(document);
            if (m1.find()) {
                value = m1.group();
                int start;
                int end;
                start = value.indexOf("\"") + 1;
                end = value.length() - 1;
                return value.substring(start, end);
            } else
                return "";
    }
    Allerdings auch etwas umständlich.

    Grüße
    dany
     

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 04.01.11, 12:26
  2. Explode mit regulären Ausdrücken
    Von bauchinj im Forum PHP
    Antworten: 1
    Letzter Beitrag: 07.10.10, 14:28
  3. URL-Überprüfung mit regulären Ausdrücken
    Von Online-Skater im Forum PHP
    Antworten: 16
    Letzter Beitrag: 11.03.10, 10:38
  4. Frage zu regulären Ausdrücken
    Von Nord-Süd-Richtung im Forum PHP
    Antworten: 5
    Letzter Beitrag: 06.12.09, 11:26
  5. Antworten: 1
    Letzter Beitrag: 18.11.05, 15:42

Stichworte