Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何完成数据流到InputSource以对其进行解析_Java_Xml_Parsing - Fatal编程技术网

Java 如何完成数据流到InputSource以对其进行解析

Java 如何完成数据流到InputSource以对其进行解析,java,xml,parsing,Java,Xml,Parsing,我正在尝试构建组合SAX/DOM解析器,它将使用SAX解析器来确定我需要的数据块,并将这些数据块逐个转发给DOM解析器。 为此,我使用的是XLMWriter,它使用PipedInputStream/PipedOutStream写入需要输入的块: public class CombinedReaderObserv { XMLOutputFactory output = null; XMLStreamWriter writer = null; PipedOutputStream out; Pipe

我正在尝试构建组合SAX/DOM解析器,它将使用SAX解析器来确定我需要的数据块,并将这些数据块逐个转发给DOM解析器。 为此,我使用的是XLMWriter,它使用PipedInputStream/PipedOutStream写入需要输入的块:

public class CombinedReaderObserv {

XMLOutputFactory output = null;
XMLStreamWriter writer = null;
PipedOutputStream out;
PipedInputStream in;
InputSource inpSourse;

public CombinedReaderObserv () throws IOException, XMLStreamException {
    out = new PipedOutputStream();
    in = new PipedInputStream(out);
    inpSourse = new InputSource(in);
    output = XMLOutputFactory.newInstance();
    writer = output.createXMLStreamWriter(out);
}

@Override
public void read(InputStream is) throws Exception {
    //Create SAX parser
    SAXParserFactory SAXfactory = SAXParserFactory.newInstance();
    SAXParser parser = SAXfactory.newSAXParser();
    SAXHandler handler = new SAXHandler();
    parser.parse(is, handler);
    writer.close(); 
}

private class SAXHandler extends DefaultHandler {

    @Override
    public void startElement(String URI,
            String localName,
            String qName,
            Attributes attributes) {
        try {
            //Enables data streaming if found Facility Site starting tag 
            //element and starts streaming data to the InputSource
            switch (qName) {
                case "FacilitySite":
                    write = true;
                    writer.writeStartDocument();
                    writer.writeStartElement("root");
                default:
                    if (write == true) {
                        writer.writeStartElement(qName);
                    }
            }
        } catch (XMLStreamException ex) {
            ex.printStackTrace();
        }
    }

    @Override
    public void endElement(String URI,
            String localName,
            String qName) {
        switch (qName) {
            //ends all XML elements and forvardsthe InputSource object  
            //to parser if found facility site element closing tag 
            case "FacilitySite":
                try {
                    writer.writeEndElement();
                    writer.writeEndElement();
                    writer.writeEndDocument();
                    reader.read(inpSourse); 
                    writer.flush();            //Program stops here
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                write = false;
                break;
            default:
                if (write == true) {
                    try {
                        writer.writeEndElement();
                    } catch (XMLStreamException ex) {
                        ex.printStackTrace();
                    }
                }
            }
        }
    }
}
问题在于正确解析InputSource对象后,parcer对象继续等待更多输入。 在解析之前关闭XML编写器不会导致任何结果,关闭管道连接会导致“管道关闭”异常

我怎样才能让DOM解析器意识到不再有输入了

更新


从管道流切换到ByteArray流有帮助。

除非有两个单独的线程,否则不要使用管道流。否则,它们可能会死锁。它们真的没有什么用处。我会去掉它,但是当我尝试创建一个踏板来解析传入的块时,结果是一样的:解析踏板停止,等待更多的输入。