Java 如何完成数据流到InputSource以对其进行解析
我正在尝试构建组合SAX/DOM解析器,它将使用SAX解析器来确定我需要的数据块,并将这些数据块逐个转发给DOM解析器。 为此,我使用的是XLMWriter,它使用PipedInputStream/PipedOutStream写入需要输入的块: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
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流有帮助。除非有两个单独的线程,否则不要使用管道流。否则,它们可能会死锁。它们真的没有什么用处。我会去掉它,但是当我尝试创建一个踏板来解析传入的块时,结果是一样的:解析踏板停止,等待更多的输入。