1

我在为在流中编辑 XML 文件的问题实施解决方案时遇到了麻烦。我得到一个 MalFormedUrlException: no protocol。XML 文件编码为 UTF-8,没有文档类型,但格式正确。我很困惑为什么会这样。

这是有问题的代码(byteArray有xml,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

例外的意思是某些东西为 XML 实体管理器提供了一个字符串,该字符串应该是一个绝对 URL……但不是。意思是 URL 没有“协议”;例如,“http://example.com”或“mailto:me@example.com”中冒号前的位。

此外,嵌套异常消息似乎在说它试图解析的假定 url 是"[B@22732273". 现在是一个很大toString的线索,因为如果你调用一个byte[]对象,它就是你得到的。

所以我的初步诊断是,您没有向我们展示的一些代码正在传递一个字节数组,它实际上应该传递一个对象,该对象将被解析为 URL 字符串。

于 2012-07-27T14:01:02.597 回答
0

尝试将“file://”附加到文件路径的开头。

于 2012-07-27T11:22:56.207 回答