2017-01-08 1 views
1

Ich möchte den Kommentar nur für das Objekt-Tag in meiner XML-Datei mit SAX-Parser in Java lesen. So lesen Sie Kommentartext mit SAX Java Parser

Dies ist ein Auszug aus meiner Datei:

<!-- Object Seed term: day, WikiTitle: day--> 
<object id="15155220" name="solar day, twenty-four hour period, 24-hour interval, mean solar day, twenty-four hours, si day, día, days, si days, day duration, day, civil day"> 
    <!-- class: "calendar day" --> 
    <class id="15157041" name="calendar day, civil day"></class> 
    <!-- class: "unit of time" --> 
    <class id="15154774" name="time units, unit of time, time unit, units of time"></class> 
    <!-- class: "" --> 
    <class id="15113229" name="period of time, time period, period"></class> 
    <!-- class: "" --> 
    <class id="00000000" name="time"></class> 
    <genericPhysicalDescription> 
     <!-- hasPart: "" --> 
     <hasPart id="15228378" name="hour, time of day"></hasPart> 
     <!-- hasPart: "" --> 
     <hasPart id="15157225" name="day"></hasPart> 
     <!-- partOf: "calendar" --> 
     <partOf id="15173479" name="calendrics, calendar, dating style, calendarist, calendars, birthday calendar, calendar strip, secular calendar, calandar, agriculture calendar, calendar system, criminal calendar"></partOf> 
     <!-- partOf: "" --> 
     <partOf id="15206296" name="month"></partOf> 
     <!-- partOf: "" --> 
     <partOf id="15157225" name="day"></partOf> 
    </genericPhysicalDescription> 
</object> 
+0

ja, meine Anmeldung basiert auf der SAX-Parser – Fast

+0

FYI, Saxophon ist etwas eine veraltete und veraltete Weg xml parsen .. –

Antwort

0

Die javax.xml.parsers.SAXParser unterstützt keine Kommentare zu lesen. Es ignoriert sie.

Die org.xml.sax.ext.LexicalHandler können Sie Kommentare beim Parsen mit org.xml.sax.XMLReader fangen. Siehe ein Beispiel unter another stackoverflow post oder tutorial at Oracle.

Wenn Sie einen Kommentar mit einem Element verbinden möchten, das direkt danach kommt, können Sie zusätzlich einen org.xml.sax.ContentHandler an den Parser übergeben und anderen XML-Inhalt nachverfolgen. Ich geeignet ist, den Code, dass object Element nur auf die oben Bezug genommen zu drucken, die sofort durch einen Kommentar vorangestellt ist:

import org.xml.sax.*; 
import org.xml.sax.ext.*; 
import org.xml.sax.helpers.*; 

import java.io.IOException; 

public class Test implements LexicalHandler, ContentHandler { 

    private String lastComment; 

    public void startDTD(String name, String publicId, String systemId) throws SAXException { 
    } 
    public void endDTD() throws SAXException { 
    } 
    public void startEntity(String name) throws SAXException { 
    } 
    public void endEntity(String name) throws SAXException { 
    } 
    public void startCDATA() throws SAXException { 
    } 
    public void endCDATA() throws SAXException { 
    } 
    public void comment(char[] text, int start, int length) throws SAXException { 
    this.lastComment = new String(text, start, length).trim(); 
    } 

    public void characters(char[] ch, int start, int length) { 
    } 
    public void endDocument() { 
    } 
    public void endElement(String uri, String localName, String qName) { 
    } 
    public void endPrefixMapping(String prefix) { 
    } 
    public void ignorableWhitespace(char[] ch, int start, int length) { 
    } 
    public void processingInstruction(String target, String data) { 
    } 
    public void setDocumentLocator(Locator locator) { 
    } 
    public void skippedEntity(String name) { 
    } 
    public void startDocument() { 
    } 
    public void startElement(String uri, String localName, String qName, Attributes atts) { 
    if (localName == "object") { 
     if (this.lastComment != null) { 
     System.out.println("Element object with comment found: \"" + this.lastComment + "\""); 
     this.lastComment = null; 
     } 
    } else { 
     this.lastComment = null; 
    } 
    } 
    public void startPrefixMapping(String prefix, String uri) { 
    } 

    public static void main(String[] args) { 
    Test test = new Test(); 
    XMLReader parser; 

    try { 
     parser = XMLReaderFactory.createXMLReader(); 
    } catch (SAXException ex1) { 
     try { 
     parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser"); 
     } catch (SAXException ex2) { 
     return; 
     } 
    } 

    try { 
     parser.setProperty("http://xml.org/sax/properties/lexical-handler", test); 
    } catch (SAXNotRecognizedException e) { 
     System.out.println(e.getMessage()); 
     return; 
    } catch (SAXNotSupportedException e) { 
     System.out.println(e.getMessage()); 
     return; 
    } 

    parser.setContentHandler(test); 

    try { 
     parser.parse("test.xml"); 
    } catch (SAXParseException e) { 
     System.out.println(e.getMessage()); 
    } catch (SAXException e) { 
     System.out.println(e.getMessage()); 
    } catch (IOException e) { 
     System.out.println(e.getMessage()); 
    } 
    } 
} 

speichern Sie diesen Code auf „Test.java“ und die XML-Inhalte zu „test.xml“. Sobald kompiliert und ausgeführt wird, sollte es Ihnen die folgende Ausgabe geben:

$ javac Test.java 
$ java Test 
Element object with comment found: "Object Seed term: day, WikiTitle: day" 
+0

dieser Code beim Start Lese Alle Kommentare e nach dem Parsen – Fast

+0

True, 'LexicalHandler' verfolgt keine Elemente; Sie müssen auch "ContentHandler" auf den Parser setzen, um zusätzliche XML-Inhalte zu verfolgen und Kommentare und Elemente miteinander verknüpfen zu können. Ich habe meine Antwort aktualisiert, um nur den Kommentar für das Element "object" zu drucken. –

+0

danke, es funktioniert! – Fast