1

ストリーム内の XML ファイルの編集に関するこの質問の解決策を実装するのに問題があります。MalFormedUrlException: no protocol が発生します。XML ファイルは UTF-8 としてエンコードされ、doctype はありませんが、整形式です。なぜこれが起こっているのか、私は困惑しています。

問題のあるコードは次のとおりです(byteArrayxmlがUpdatingXmlReaderあり、私のクラスです):

    XMLReader reader =
        new UpdatingXmlReader(SAXParserFactory.newInstance().newSAXParser());
    Transformer xform = TransformerFactory.newInstance().newTransformer();

    InputSource inputSource = 
        new InputSource(new ByteArrayInputStream(byteArray));
    StreamResult streamResult = 
        new StreamResult(response.getOutputStream());

    SAXSource saxSource = new SAXSource(reader, inputSource);                       

    xform.transform(saxSource, streamResult);

私のテストでどのように呼び出されるか:

    File file = new File("c:/test.xml");
    InputStream input = new FileInputStream(file);
    byte[] b = IOUtils.toByteArray(input);
    // in production the byte array will come from the database
    service.method(b, httpServletResponse ,httpServletRequest)

スタックトレースは次のとおりです。

javax.xml.transform.TransformerException: 
    java.net.MalformedURLException: no protocol: 
    at org.apache.xalan.transformer.TransformerIdentityImpl.transform(Unknown Source)
Caused by: java.net.MalformedURLException: no protocol: [B@22732273
    at java.net.URL.<init>(URL.java:579)
    at java.net.URL.<init>(URL.java:476)
    at java.net.URL.<init>(URL.java:425)
    at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)
    at org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(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 org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
    at org.apache.xerces.jaxp.SAXParserImpl.parse(Unknown Source)
4

2 に答える 2

0

ファイルパスの先頭に「file://」を追加してみてください。

于 2012-07-27T11:22:56.207 に答える
0

例外が言っているのは、何かが絶対 URL であるはずの文字列を XML エンティティ マネージャーに提供したことですが、そうではありません。URL には「プロトコル」がないと言っています。たとえば、「http://example.com」または「mailto:me@example.com」のコロンの前のビット。

さらに、ネストされた例外メッセージは、解析しようとしていると思われる URL は"[B@22732273". オブジェクトを呼び出すと得られるものなので、これは大きな手がかりですtoStringbyte[]

したがって、私の暫定的な診断は、あなたが私たちに示していないコードがバイト配列を渡しているということです。実際には、URL 文字列として解析解除されるオブジェクトを渡す必要があります。

于 2012-07-27T14:01:02.597 に答える