XMLStreamWriter异常:与任何元素无关的属性

时间:2014-06-25 15:17:26

标签: java xmlstreamwriter

我得到了这个例外:

javax.xml.stream.XMLStreamException: Attribute not associated with any element
    at com.sun.xml.internal.stream.writers.XMLStreamWriterImpl.writeAttribute(Unknown Source)
    at de.dhbw.horb.routePlanner.parser.GraphDataParser$2.run(GraphDataParser.java:136)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)*

从下面的代码中。 我只是不明白它来自哪里。

public void writeEdgeXML() throws XMLStreamException {

    final long[] idCount = new long[1];

    XMLOutputFactory factory = XMLOutputFactory.newInstance();

    try {
        final XMLStreamWriter writer = factory
                .createXMLStreamWriter(new FileOutputStream(
                        GraphDataConstants.CONST_XML_EDGE), "UTF-8");

        writer.writeStartDocument("UTF-8", "1.0");

        while (graphSR.hasNext()) {
            if (graphSR.nextStartElement() && graphSR.isWay()) {

                final Way nextWay = getWay(null);

                Controller.executor.getExecutor().submit(new Runnable() {

                    @Override
                    public void run() {

                        while (nextWay != null && nextWay.hasEdge()) {

                            try {
                                idCount[0]++;
                                Edge e = nextWay.removeFirstEdge();
                                writer.writeStartElement(GraphDataConstants.CONST_EDGE);
                                writer.writeAttribute(
                                        GraphDataConstants.CONST_EDGE_ID,
                                        String.valueOf(idCount[0]));
                                writer.writeEmptyElement(GraphDataConstants.CONST_EDGE_NODE);
                                writer.writeAttribute(
                                        GraphDataConstants.CONST_EDGE_ID,
                                        String.valueOf(e.getStartNode()
                                                .getID()));
                                writer.writeAttribute(
                                        GraphDataConstants.CONST_EDGE_LATITUDE,
                                        String.valueOf(e.getStartNode()
                                                .getLatitude()));
                                writer.writeAttribute(
                                        GraphDataConstants.CONST_EDGE_LONGITUDE,
                                        String.valueOf(e.getStartNode()
                                                .getLongitude()));                                  

                                writer.writeEndElement();
                                writer.flush();

                            } catch  (XMLStreamException e) {
                                   e.printStackTrace();
                            }

                        }
                    }
                });
            }
        }

1 个答案:

答案 0 :(得分:1)

XMLStreamWriter不是线程安全的。

您正在创建单个XMLStreamWriter,然后尝试使用它一次在多个线程中编写元素。这并不能保证完全正常工作,如果它确实存在,那么您创建的元素和属性必然会最终达到您期望的位置。我怀疑错误是在

的条件下达到了竞争状态
Thread 1             Thread 2
--------             --------
1) emptyElement
2) attribute
                     3) emptyElement
4) endElement
                     5) attribute (BANG!)

您需要将所有XML写入序列化为单个线程。

相关问题