Являются ли множественные вызовы java SaxParser.parse(String, Handler) законными?

У меня есть анализатор java SAX, который я хотел бы вызывать несколько раз для одного и того же обработчика с разными файлами XML. Я использую это в сочетании с iText для создания многостраничного PDF-документа, где на некоторых страницах есть одна карта тегов XML, а на других страницах — другая. Например,

parser.parse("xmlFile1", handler);
parser.parse("xmlFile2", handler);

Когда я пытаюсь это сделать, я получаю исключение java.lang.RuntimeException со следующей трассировкой стека:

DocumentException: java.lang.RuntimeException: The document is not open.
at com.lowagie.text.pdf.PdfWriter.getDirectContent(PdfWriter.java:695)
at com.lowagie.text.pdf.PdfDocument.newPage(Unknown Source)
at com.lowagie.text.pdf.PdfDocument.carriageReturn(Unknown Source)
at com.lowagie.text.pdf.PdfDocument.add(Unknown Source)
at com.lowagie.text.Document.add(Unknown Source)
at myClass.myCode(Unknown Source)
org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:345)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:223)
at myClass.myCode(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)

Вызывает ли метод SaxParser.parse неявно document.close()? Или в моем коде есть какая-то другая проблема, которую мне нужно изолировать и исправить?


person Sam    schedule 03.01.2011    source источник


Ответы (1)


  • Повторное использование одного и того же синтаксического анализатора разрешено (если он не используется одновременно)
  • Анализатор запускает "endDocument". Кажется, здесь закрывается документ iText. Но парсер этого не делает — это код вашего обработчика.
person mtraut    schedule 03.01.2011
comment
Я установил для ControlOpenClose значение true, что заставляет SAXiTextHandler автоматически закрывать документ, когда handleEndingTags вызывается из метода endElement. Подробнее о реализации SAXiTextHandler см. в следующем коде: docjar.com/html/api/com/lowagie/text/xml/ - person Sam; 03.01.2011