3

アプリケーションJSON -> XMLコンバーターがあります。このアプリケーションは、ListXML に 1 つずつ変換される一連のイベントを受け取ります。変換前に、メソッドを使用して最終的な XML のヘッダーが作成されstart、後で変換されたイベントがxmlEventWriter1 つずつ追加されます。最後に、すべての変換の後、endメソッドを使用して終了タグが XML に追加されます。

タグを閉じる際に問題が発生し、次のエラーが発生します。

javax.xml.stream.XMLStreamException: No open start element, when trying to write end element

私の理解では、すべてが正しいのですが、まだ問題に直面している理由がわかりません。

header body and closure以下は、 XML でタグを作成するクラスです。



public class EventXMLStreamCollector implements EventsCollector<OutputStream> {

    private final OutputStream stream;
    private final XMLEventWriter xmlEventWriter;
    private final XMLEventFactory events;

    public EventXMLStreamCollector(OutputStream stream) {
        this.stream = stream;
        try {
            xmlEventWriter = XMLOutputFactory.newInstance().createXMLEventWriter(stream);
            events = XMLEventFactory.newInstance();
        } catch (XMLStreamException e) {
            throw new EventFormatConversionException("Error occurred during the creation of XMLEventWriter : " + e);
        }

    }

    public void collect(Object event) {
        System.out.println("COLLECT START");
        try {
            XMLEventReader xer = new EventReaderDelegate(XMLInputFactory.newInstance().createXMLEventReader(new StringReader(event.toString()))) {
                @Override
                public boolean hasNext() {
                    if (!super.hasNext())
                        return false;
                    try {
                        return !super.peek().isEndDocument();
                    } catch (XMLStreamException ignored) {
                        return true;
                    }
                }
            };
            if (xer.peek().isStartDocument()) {
                xer.nextEvent();
                xmlEventWriter.add(xer);
            }
        } catch (XMLStreamException e) {
            throw new EventFormatConversionException("Error occurred during the addition of events to XMLEventWriter: " + e);
        }
        System.out.println("COLLECT END");
    }

    @Override
    public OutputStream get() {
        return stream;
    }

    @Override
    public void start(Map<String, String> context) {
        System.out.println("START START");
        try {
            xmlEventWriter.add(events.createStartDocument());
            xmlEventWriter.add(events.createStartElement(new QName("doc:Document"), null, null));
            xmlEventWriter.add(events.createNamespace("doc", "urn:one"));
            xmlEventWriter.add(events.createNamespace("xsi", "http://www.w3.org/2001/XMLSchem-instance"));
            xmlEventWriter.add(events.createNamespace("cbvmda", "urn:two"));
            
            for (Map.Entry<String, String> stringStringEntry : context.entrySet()) {
                xmlEventWriter.add(events.createAttribute(stringStringEntry.getKey(), stringStringEntry.getValue()));
            }

            xmlEventWriter.add(events.createStartElement(new QName("Body"), null, null));
            xmlEventWriter.add(events.createStartElement(new QName("EventList"), null, null));
        } catch (XMLStreamException e) {
            throw new EventFormatConversionException("Error occurred during the creation of final XML file header information " + e);
        }
        System.out.println("START END");
    }

    @Override
    public void end() {
        System.out.println("END START");
        try {
            System.out.println(xmlEventWriter.toString());
            xmlEventWriter.add(events.createEndElement(new QName("EventList"), null));
            xmlEventWriter.add(events.createEndElement(new QName("Body"), null));
            xmlEventWriter.add(events.createEndElement(new QName("doc:Document"), null));
            xmlEventWriter.add(events.createEndDocument());
            xmlEventWriter.close();
        } catch (XMLStreamException e) {
            throw new EventFormatConversionException("Error occurred during the closing xmlEventWriter:" + e);
        }
        System.out.println("END END");
    }

    @Override
    public void collectSingleEvent(Object event) {
        try {
            XMLEventReader xer = XMLInputFactory.newInstance().createXMLEventReader(new StringReader(event.toString()));
            if (xer.peek().isStartDocument()) {
                xer.nextEvent();
            }
            xmlEventWriter.add(xer);
        } catch (XMLStreamException e) {
            System.out.println("ADDED : " + e.getMessage());
            throw new EventFormatConversionException("Error occurred during the addition of events to XMLEventWriter: " + e);
        }
    }
}

この行のエラーが発生しています:

xmlEventWriter.add(events.createEndElement(new QName("Body"), null));

なぜこのエラーが発生するのかわかりません。タグを開いてBodyから閉じようとしています。フローは正しいと確信しています。 、 、そして最後に を呼び出してstartcollectますend。に続いて、output私は得ています:

START START
START END
COLLECT START
COLLECT END
END START

タグEND ENDでエラーが発生したため、取得できません。closing of Bodyこの問題を理解し、回避策とヘルプを提供してください。

4

0 に答える 0