2017-01-08 19 views
1

JavaのSAXパーサーを使用して、XMLファイル内のオブジェクトタグのコメントのみを読みたいと思います。SAX Javaパーサーでコメントテキストを読む方法

これが私のファイルの抽象である:

<!-- 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

をはい、私のアプリケーションはFYI、SAXパーサー – Fast

+0

に基づいており、サックスはややXMLを解析する時代遅れと時代遅れの方法..です –

答えて

0

javax.xml.parsers.SAXParserコメントを読んでサポートしていません。それは無視されます。

org.xml.sax.ext.LexicalHandlerは、org.xml.sax.XMLReaderで解析するときにコメントをキャッチすることができます。たとえば、another stackoverflow postまたはtutorial at Oracleを参照してください。

コメントの後ろにある要素にコメントを追加する場合は、さらにorg.xml.sax.ContentHandlerをパーサーに渡して他のXMLコンテンツを追跡することができます。

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()); 
    } 
    } 
} 

保存このコードを「Test.java」と「のtest.xml」へのあなたのXMLコンテンツ:私はそのobjectすぐにコメントが付いている要素を、印刷するには先に言及したコードを適応しました。一度コンパイルして実行、それはあなたの次の出力与える必要があります:

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

このコード際に開始読みますすべてのコメントeは、解析の後に – Fast

+0

真、 'LexicalHandler'は要素を追跡しません; 'ContentHandler'をパーサにも設定し、追加のXMLコンテンツを追跡し、コメントと要素を関連付けることができるようにする必要があります。私は 'object'要素のコメントだけを表示するように答えを更新しました。 –

+0

ありがとうございます! – Fast

関連する問題