2014-06-17 44 views
0

http://docs.oracle.com/javaee/5/api/javax/xml/stream/XMLStreamReader.html如何擴展XMLStreamReader?

我想擴展XMLStreamReader,但它是一個接口。

我想要做的事,如:

public class GraphDataStreamReader extends XMLStreamReader{ 

    public GraphDataStreamReader(){ 
    super(); 
    } 

    public void nextStartElement() throws XMLStreamException { 
    do { 
     super.next(); 
    } while (!super.isStartElement()); 
    } 
} 

其他類:

XMLInputFactory factory = XMLInputFactory.newInstance(); 
GraphDataStreamReader streamReader = (GraphDataStreamReader) factory.createXMLStreamReader(new FileReader(xmlFile)); //returns XMLStreamReader 
streamReader.next(); //method from XMLStreamReader 
streamReader.nextStartElement(); //method from GraphDataStreamReader 

這是更多鈔票?如果是,那麼如何?

+0

使用 「工具」,而不是 「擴展」 – CocoNess

+1

如果你有Java 6的上面可以延長[StreamReaderDelegate](http://docs.oracle.com /javase/8/docs/api/javax/xml/stream/util/StreamReaderDelegate.html)。 – McDowell

+0

@McDowell:看起來就像我在尋找的東西。 但演員陣容出現錯誤。你能否回答這個問題? – Spen

回答

2

這裏是如何延長StreamReaderDelegate:或

class GraphDataStreamReader extends StreamReaderDelegate { 
    public GraphDataStreamReader(XMLStreamReader reader) { 
    super(reader); 
    } 

    public void nextStartElement() throws XMLStreamException { 
    do { 
     super.next(); 
    } while (!super.isStartElement()); 
    } 
} 

XMLInputFactory factory = XMLInputFactory.newInstance(); 
GraphDataStreamReader streamReader = new GraphDataStreamReader(
           factory.createXMLStreamReader(fileInputStream)); 
streamReader.next(); 
streamReader.nextStartElement(); 
+0

我試過了,但新的streamReader爲null。 – Spen

+0

'streamReader'在這段代碼中永遠不能爲空 - 在聲明行上爲它分配一個新對象。 – McDowell

+0

你是對的;)我在代碼中有一個錯誤... 謝謝,知道它的作品:) – Spen

2

你可以嘗試委託模式,就像這樣:

public class GraphDataStreamReader implements XMLStreamReader { 

    private XMLStreamReader delegate; 

    public GraphDataStreamReader (XMLStreamReader delegate) { 
     this.delegate = delegate; 
    } 

    @Override 
    public void close() throws XMLStreamException { 
     delegate.close(); 
    } 

    ... similar for other methods of XMLStreamReader ... 

    ... then add your own methods ... 
} 
+0

Hey Manfreed,謝謝你的幫助,我不認爲這就是我要找的,除此之外已經有一個委託類(如McDowell寫的) - > StreamReaderDelegate – Spen

0

我現在已經解決了它(嘗試了很多之後)。

擴展的XMLStreamReader與自己methodes:

public class GraphDataStreamReader extends XMLStreamReaderImpl { 
    public GraphDataStreamReader(InputStream arg0, PropertyManager arg1) throws XMLStreamException { 
    super(arg0, arg1); 
    } 
    public boolean nextStartElement() throws XMLStreamException { 
    .... 
    } 
} 

類使用GraphDataStreamReader:

public class GraphDataParser { 
    private GraphDataStreamReader graphSR; 

    private GraphDataParser(String xmlFile) throws FileNotFoundException, XMLStreamException { 
    FileInputStream inStream = new FileInputStream(new File(xmlFile)); 
    graphSR = new GraphDataStreamReader(inStream, new PropertyManager(1)); 
    } 
} 

感謝您的想法。大部分學分歸McDowell所有。因爲他的職位我一直在努力嘗試。 我希望這個問題對別人來說還是很有用的。

+0

這是否擴展'com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl'?這不是一個好主意。 – McDowell

+0

是的,爲什麼?工作正常。 – Spen

+1

這是內部API;如果你升級你的Java運行時或運行在一個不同的實現上,那個類可能不在那裏 – McDowell