tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
8
ZUGRIFFE
594
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    socke999 socke999 ist offline Mitglied Gold
    Registriert seit
    Aug 2005
    Beiträge
    122
    Hallo,
    kennt jemand eine Möglichkeit einen Simplen String der xml enthält zu parsen?

    Es geht um folgendes:
    Ich habe in meinen Java-Programm einen simplen String der xml enthält.
    z.B. So was:

    Code :
    1
    
    String s = "<myatribute name=\"Mein Name\" > Beispiel Text   </myatribute>";

    Nun, soweit ich gesehen habe, gibt es 2 möglichkeiten ein XML File in JAVA zu parsen.
    JDom und Sax.

    jedoch parsen beide immer nur ein xml File, ich möchte aber nur einen einfachen XML-String parsen.

    und am besten so wie JDOM die einzelnen Elemente und Attribute abfragen können wäre super.

    Kennt jemand so etwas? Oder kann jemand da weiter helfen?
    Geändert von socke999 (13.11.09 um 20:09 Uhr)
     

  2. #2
    kabel2 kabel2 ist offline Mitglied Gold
    Registriert seit
    Aug 2005
    Beiträge
    138
    Tjo Java ist da ein bisschen schwach auf der Brust:
    http://stackoverflow.com/questions/2...stream-in-java
    C++ kennt stringstreams, in .Net gibts ... OOPS auch nix, siehe hier.
    Ganz schönes Trauerspiel...

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    public class Main {
        
        public static void main(String[] args) throws Exception {
     
            String xml = "<hi><ho>data</ho></hi>";
            ByteArrayInputStream bais = new ByteArrayInputStream(xml.getBytes(Charset.defaultCharset()));
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser p = factory.newSAXParser();
            p.parse(bais, new DefaultHandler() {
                @Override
                public void startElement(String uri, String localName,
                        String qName, Attributes attributes) throws SAXException {
                    System.out.println(qName);
                }
            });
        }
        
    }
     

  3. #3
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    In Java kann man den StringReader nutzen. Der funktioniert genau wie der InputStreamReader. Ist auch logisch, da er das gleiche Interface implementiert .

    Code java:
    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
    
    import java.io.StringReader;
     
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
     
    import org.xml.sax.Attributes;
    import org.xml.sax.InputSource;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
     
    public class StringXMLExample {
     
        public static void main(String[] args) throws Exception {
            String xml = "<hi><ho>data</ho></hi>";
            StringReader reader = new StringReader(xml);
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser p = factory.newSAXParser();
            p.parse(new InputSource(reader), new DefaultHandler() {
     
                public void startElement(String uri, String localName,
                        String qName, Attributes attributes) throws SAXException {
                    System.out.println(qName);
                }
            });
        }
     
    }

    Gruß

    Sascha
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  4. #4
    kabel2 kabel2 ist offline Mitglied Gold
    Registriert seit
    Aug 2005
    Beiträge
    138
    Zitat Zitat von Sascha Schirra Beitrag anzeigen
    In Java kann man den StringReader nutzen. Der funktioniert genau wie der InputStreamReader. Ist auch logisch, da er das gleiche Interface implementiert .
    Ja, OK. Aber beide implementieren keinen InputStream. und da liegt der Hund begraben.
    Der "Trick" ist die InputSource, die das wegkapselt.
    Das heißt, SAX-intern muss irgendwo zwischen Stream und Reader unterschieden werden.

    Zitat Zitat von Sascha Schirra Beitrag anzeigen
    Code java:
    1
    
    p.parse(new InputSource(reader), new DefaultHandler() {
    Stellt sich noch die rhetorische Frage, warum das SAX wohl so macht
     

  5. #5
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    Das heißt, SAX-intern muss irgendwo zwischen Stream und Reader unterschieden werden.
    Naja, groß wird da auch nicht unterschieden. Denn intern wird der Stream auch in eine InputSource gepackt.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
     public void parse(InputStream is, DefaultHandler dh)
            throws SAXException, IOException {
            if (is == null) {
                throw new IllegalArgumentException("InputStream cannot be null");
            }
     
            InputSource input = new InputSource(is);
            this.parse(input, dh);
        }

    Meiner Meinung nach ist der einzige Grund, warum direkt Methoden mit Streams angeboten werden ist, dass man meistens die XML-Daten aus irgendeinem Input-Stream bekommt.

    Gruß

    Sascha
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  6. #6
    kabel2 kabel2 ist offline Mitglied Gold
    Registriert seit
    Aug 2005
    Beiträge
    138
    So habe ich das nicht betrachtet Da ist die API schon ein wenig komisch.
    Was ich gemeint habe ist dass die Reader und die InputStream nichts miteinander gemein haben, und die InputSource quasi eine Abstraktion über beide darstellen, die intern von der Parser-Infrastruktur genutzt wird.

    Ich hab mir gerade die OpenJDK 6 Sourcen gezogen, und wollte mal ein bisschen reinschnuppern.
    Sind das die richtigen Sourcen?
     

  7. #7
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    Sind das die richtigen Sourcen?
    Was meinst du damit? Es sind die Sourcen einer JDK-Implementierung.

    Gruß

    Sascha
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  8. #8
    THMD THMD ist offline Mitglied Gold
    Registriert seit
    Sep 2005
    Beiträge
    122
    Tach auch,

    Zitat Zitat von kabel2 Beitrag anzeigen
    Was ich gemeint habe ist dass die Reader und die InputStream nichts miteinander gemein haben,
    Naja - haben sie schon - beides sind Streams - die InputStreams sind ByteStreams und die Reader CharacterStreams.

    Die InputSource bietet den Parsern die Möglichkeit abzufragen, ob die Daten als ByteStream (InputStream) oder bereits als CharacterStream vorliegen (Reader). Im letzteren Fall spart sich der Parser das Umwandeln, was er ja bei ByteStreams erst mal machen muss.

    Gruß
    THMD
     
    If Java had true garbage collection, most programs would delete themselves upon execution. (Robert Sewell)

  9. #9
    kabel2 kabel2 ist offline Mitglied Gold
    Registriert seit
    Aug 2005
    Beiträge
    138
    Zitat Zitat von Sascha Schirra Beitrag anzeigen
    Was meinst du damit? Es sind die Sourcen einer JDK-Implementierung.
    Hmm, also beim reindebuggen sah das gerade nicht gut aus. (OK, hätte ich auch selber draufkommen können...)
    Ich ziehe gerade noch die jdk6 source direkt von java.sun.com.
    Was mich da schon wieder stutzig macht ist dass die Source-Datei "jdk-6u18-..." heißt, es aber nur ein JDK "jdk-6u17..." gibt. Naja, das wird hoffentlich dann passen.

    Was mich an der Geschichte gerade noch interessiert ist wer innerhalb der Klassenkonglomerats die Konvertierung InputStream -> Reader (oder andersrum) macht, oder ob das überhaupt gemacht wird. Beim statischen Durchgucken hab ich irgendwann die Übersicht verloren Hab nur gesehen dass die InputSource munter durch die Gegend geschoben wird...
    Ich hatte erwartet dass die InputSource Klasse die Konvertierung macht, aber die macht ziemlich genau gar nichts.

    OK, also intern gibts noch einen XMLInputSource, die wiederum nichts mit InputSource zu tun hat. Der werden einfach alle Daten anvertraut.
    Nach einigem Suchen: Das wird im XMLEntityManager gemacht, Methode #setupCurrentEntity(). Puh, da wird einiges mit spezifischen Encodings gemacht.
    Der InputStream wird zuerst in einen RewindableInputStream gewrappt, und dann in einen UTF8Reader, ASCIIReader oder BufferedReader.

    Was für ein Aufwand
     

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 18.07.08, 11:55
  2. Antworten: 2
    Letzter Beitrag: 26.02.08, 15:42
  3. xml syntax und normalen string ausgeben lassen
    Von darksmilie im Forum Java
    Antworten: 6
    Letzter Beitrag: 04.06.07, 08:03
  4. Passfoto aus einem normalen Bild
    Von Johnnyr im Forum Photoshop
    Antworten: 7
    Letzter Beitrag: 25.11.05, 14:25
  5. Notebook 2,5" Festplatte an einem normalen PC anschließen?
    Von philedephilphil im Forum Hardware
    Antworten: 1
    Letzter Beitrag: 24.07.04, 11:47