3

これまでのところ、これは失敗の話であり、アドバイスは大歓迎です。私は次のことを試しました:

Saxon で JAXP を使用した XMLStreamReader から Document へ

コード:

JSONObject obj = new JSONObject("{\"alice\":{\"bob\": \"a\"}}");
AbstractXMLStreamReader reader = new MappedXMLStreamReader(obj);

StAXSource source = new StAXSource(reader);
Document document = XMLUtils.createDocument();
DOMResult result = new DOMResult(document);
Transformer identity = TransformerUtils.getIdentityTransformer();
identity.transform(source, result);
result.getNode();

使用している Saxon トランスフォーマーが StAXSource をサポートしていないため、これは失敗します。例外は次のとおりです。

org.orbeon.saxon.trans.DynamicError: A source of type javax.xml.transform.stax.StAXSource is not supported in this environment
    org.orbeon.saxon.event.Sender.send(Sender.java:185)
    org.orbeon.saxon.IdentityTransformer.transform(IdentityTransformer.java:29)
    org.orbeon.oxf.xml.TransformerWrapper.transform(TransformerUtils.java:597)
    org.apache.jsp.gaga_jsp._jspService(gaga_jsp.java:93)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

Xalan で JAXP を使用した XMLStreamReader から Document へ

コード:

JSONObject obj = new JSONObject("{\"alice\":{\"bob\": \"a\"}}");
AbstractXMLStreamReader reader = new MappedXMLStreamReader(obj);

StAXSource source = new StAXSource(reader);
Document document = XMLUtils.createDocument();
DOMResult result = new DOMResult(document);
Transformer identity = orbeon.apache.xalan.processor.TransformerFactoryImpl.newInstance().newTransformer();
identity.transform(source, result);
result.getNode();

これは、Xalan 2.5.1 (使用しているバージョン) では失敗します。最新バージョンは 2.7.1 で、そのバージョンで StAXSource のサポートが追加された可能性があります。

javax.xml.transform.TransformerException: Can't transform a Source of type javax.xml.transform.stax.StAXSource
    orbeon.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:372)
    org.apache.jsp.gaga_jsp._jspService(gaga_jsp.java:82)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

XMLEventWriter と DOMResult を使用した XMLStreamReader から Document へ

コード:

JSONObject obj = new JSONObject("{\"alice\":{\"bob\": \"a\"}}");
AbstractXMLStreamReader streamReader = new MappedXMLStreamReader(obj);
XMLInputFactory readerFactory = XMLInputFactory.newInstance();
XMLEventReader eventReader = readerFactory.createXMLEventReader(streamReader);

Document document = XMLUtils.createDocument();
DOMResult result = new DOMResult(document);
XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
XMLEventWriter eventWriter = outputFactory.createXMLEventWriter(result);
eventWriter.add(eventReader);
eventWriter.close();

result.getNode();

これは、Xerces で NPE につながります。

java.lang.NullPointerException
    orbeon.apache.xerces.dom.CoreDocumentImpl.setXmlVersion(CoreDocumentImpl.java:850)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    com.sun.xml.internal.stream.writers.XMLDOMWriterImpl.writeStartDocument(XMLDOMWriterImpl.java:583)
    com.sun.xml.internal.stream.writers.XMLEventWriterImpl.add(XMLEventWriterImpl.java:96)
    com.sun.xml.internal.stream.writers.XMLEventWriterImpl.add(XMLEventWriterImpl.java:72)
    org.apache.jsp.gaga_jsp._jspService(gaga_jsp.java:95)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

XMLEventWriter および Writer を使用した XMLStreamReader から Document へ

コード:

JSONObject obj = new JSONObject("{\"alice\": {\"bob\": \"a\"}}");
AbstractXMLStreamReader streamReader = new MappedXMLStreamReader(obj);
XMLInputFactory readerFactory = XMLInputFactory.newInstance();
XMLEventReader eventReader = readerFactory.createXMLEventReader(streamReader);

StringWriter stringWriter = new StringWriter();
XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
XMLEventWriter eventWriter = outputFactory.createXMLEventWriter(stringWriter);
eventWriter.add(eventReader);
eventWriter.close();

out.print(stringWriter.toString());

Java 5 では、com.bea.xml.stream.MXParserFactoryどこにも見つからないものを探します。

javax.xml.stream.FactoryConfigurationError: Provider com.bea.xml.stream.MXParserFactory not found
    javax.xml.stream.FactoryFinder.newInstance(FactoryFinder.java:72)
    javax.xml.stream.FactoryFinder.find(FactoryFinder.java:178)
    javax.xml.stream.FactoryFinder.find(FactoryFinder.java:92)
    javax.xml.stream.XMLInputFactory.newInstance(XMLInputFactory.java:136)
    org.apache.jsp.gaga_jsp._jspService(gaga_jsp.java:79)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

XMLEventAllocatorImplJava 6 では、Sun の次のような NPE につながります。

java.lang.NullPointerException
    com.sun.xml.internal.stream.events.XMLEventAllocatorImpl.getXMLEvent(XMLEventAllocatorImpl.java:82)
    com.sun.xml.internal.stream.events.XMLEventAllocatorImpl.allocate(XMLEventAllocatorImpl.java:55)
    com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(XMLEventReaderImpl.java:86)
    com.sun.xml.internal.stream.writers.XMLEventWriterImpl.add(XMLEventWriterImpl.java:72)
    org.apache.jsp.gaga_jsp._jspService(gaga_jsp.java:85)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

BadgerFishDOMDocumentParser の使用

コード:

ByteArrayInputStream bais = new ByteArrayInputStream("{\"alice\": {\"bob\": \"a\"}}".getBytes());
Document resDOM = new BadgerFishDOMDocumentParser().parse(bais);

これにより、Sun の NPE が得られますXMLEventAllocatorImpl

java.lang.NullPointerException
    com.sun.xml.internal.stream.events.XMLEventAllocatorImpl.getXMLEvent(XMLEventAllocatorImpl.java:82)
    com.sun.xml.internal.stream.events.XMLEventAllocatorImpl.allocate(XMLEventAllocatorImpl.java:55)
    com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(XMLEventReaderImpl.java:86)
    com.sun.xml.internal.stream.writers.XMLEventWriterImpl.add(XMLEventWriterImpl.java:72)
    org.codehaus.jettison.AbstractDOMDocumentParser.parse(AbstractDOMDocumentParser.java:66)
    org.apache.jsp.gaga_jsp._jspService(gaga_jsp.java:79)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

4

3 に答える 3

0

JSON は XML ではありません - XML パーサーを使用して JSON オブジェクトを解析しようとしているように見えますか? しかし、私はあなたが何を得ているのか誤解しているかもしれません。

于 2009-05-12T20:26:04.617 に答える
0

私もこの問題を抱えていて、OPと同じ欲求不満を経験しました. どこかの woodstox メーリング リストで、この動作がバグとして言及されていました。しかし、私は解決策を開発することができました。私は XMLStreamReader をラップする非常に基本的な XMLEventReader を作成しましたが、うまく機能しました。2 つの重要な注意事項: 1) このコードは現状のまま提供されます。具体的には、私自身の限られた用途を超えて徹底的にテストしていないこと、および 2) この問題がインターネット上の他の場所では事実上存在しないという事実、およびこれが Jettison が実行する必要がある比較的基本的な操作であるように思われるという事実、私たちは何か根本的に間違ったことをしており、この解決策は必要ないことを強く示唆しています. あなた自身の判断を使用してください。

まず、動作する XMLEventReader を次に示します。

import java.util.LinkedList;
import java.util.Queue;

import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.XMLEvent;

import com.sun.xml.internal.stream.events.AttributeImpl;
import com.sun.xml.internal.stream.events.CharacterEvent;
import com.sun.xml.internal.stream.events.CommentEvent;
import com.sun.xml.internal.stream.events.DTDEvent;
import com.sun.xml.internal.stream.events.EndDocumentEvent;
import com.sun.xml.internal.stream.events.EndElementEvent;
import com.sun.xml.internal.stream.events.NamespaceImpl;
import com.sun.xml.internal.stream.events.ProcessingInstructionEvent;
import com.sun.xml.internal.stream.events.StartDocumentEvent;
import com.sun.xml.internal.stream.events.StartElementEvent;

public class WorkingXMLEventReader implements XMLEventReader {

    private final XMLStreamReader streamReader;
    private final Queue<XMLEvent> eventQueue = new LinkedList<XMLEvent>();

    public WorkingXMLEventReader (XMLStreamReader streamReader) {
        this.streamReader = streamReader;
    }

    @Override public Object next () {
        try {
            return nextEvent();
        } catch (XMLStreamException x) {
            return null;
        }
    }

    @Override public void remove () {
        throw new UnsupportedOperationException("WorkingXMLEventReader iterator interface does not support remove()");
    }

    @Override public void close () throws XMLStreamException {
        streamReader.close();
        eventQueue.clear();
    }

    @Override public String getElementText () throws XMLStreamException {
        return streamReader.getElementText();
    }

    @Override public Object getProperty (String key) throws IllegalArgumentException {
        return streamReader.getProperty(key);
    }

    @Override public boolean hasNext () {
        try {
            return !eventQueue.isEmpty() || streamReader.hasNext();
        } catch (XMLStreamException x) {
            return false;
        }
    }

    @Override public XMLEvent nextEvent () throws XMLStreamException {
        if (eventQueue.isEmpty())
            parseEvents(eventQueue, streamReader, streamReader.next());
        return eventQueue.remove();
    }

    @Override public XMLEvent nextTag () throws XMLStreamException {
        if (eventQueue.isEmpty())
            parseEvents(eventQueue, streamReader, streamReader.nextTag());
        return eventQueue.remove();        
    }

    @Override public XMLEvent peek () throws XMLStreamException {
        return eventQueue.peek();
    }

    protected static void parseEvents (Queue<XMLEvent> events, XMLStreamReader reader, int type) {
        switch (type) {
        case XMLEvent.START_ELEMENT: 
            events.add(new StartElementEvent(reader.getName()));
            break;
        case XMLEvent.END_ELEMENT: 
            events.add(new EndElementEvent(reader.getName()));
            break;
        case XMLEvent.CDATA:
            events.add(new CharacterEvent(reader.getText(), true, false));
            break;
        case XMLEvent.SPACE:
            events.add(new CharacterEvent(reader.getText(), false, true));
            break;
        case XMLEvent.CHARACTERS: 
            events.add(new CharacterEvent(reader.getText(), false, false));
            break;
        case XMLEvent.ATTRIBUTE:
            for (int n = 0; n < reader.getAttributeCount(); ++ n) {
                AttributeImpl attr = new AttributeImpl(reader.getAttributePrefix(n), 
                        reader.getAttributeNamespace(n), reader.getAttributeLocalName(n), 
                        reader.getAttributeValue(n), reader.getAttributeType(n));
                events.add(attr);
            }
            break;
        case XMLEvent.NAMESPACE:
            for (int n = 0; n < reader.getNamespaceCount(); ++ n) {
                NamespaceImpl ns = new NamespaceImpl(reader.getNamespacePrefix(n), 
                        reader.getNamespaceURI(n));
                events.add(ns);
            }
            break;
        case XMLEvent.PROCESSING_INSTRUCTION:
            events.add(new ProcessingInstructionEvent(reader.getPITarget(), reader.getPIData()));
            break;
        case XMLEvent.COMMENT:
            events.add(new CommentEvent(reader.getText()));
            break;
        case XMLEvent.START_DOCUMENT:
            events.add(new StartDocumentEvent(reader.getEncoding(), reader.getVersion()));
            break;
        case XMLEvent.END_DOCUMENT:
            events.add(new EndDocumentEvent());
            break;
        case XMLEvent.DTD:
            events.add(new DTDEvent(reader.getText()));
            break;
        }   
    }

}

次に、OPの例でそれを使用する方法は次のとおりです。

XMLStreamReader streamReader = new MappedXMLStreamReader(new JSONObject("{\"alice\":{\"bob\": \"a\"}}"));
XMLEventReader eventReader = new WorkingXMLEventReader(streamReader);

Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
XMLEventWriter eventWriter = XMLOutputFactory.newInstance().createXMLEventWriter(new DOMResult(document));
eventWriter.add(eventReader);
eventWriter.close();

// test
Source testSource = new DOMSource(document);
Result testResult = new StreamResult(System.out);
TransformerFactory.newInstance().newTransformer().transform(testSource, testResult);

The output should be something like:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><alice><bob>a</bob></alice>

Hopefully that helps somebody.

于 2011-11-05T23:05:30.433 に答える