MalformedURLException: нет протокола с преобразователем Xalan

У меня возникли проблемы с реализацией решения для этого вопроса при редактировании файла XML в потоке. Я получаю MalFormedUrlException: нет протокола. Файл 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)

person blank    schedule 27.07.2012    source источник


Ответы (2)


Попробуйте добавить «file://» в начало пути к файлу.

person zizoujab    schedule 27.07.2012

Исключение говорит о том, что что-то предоставило диспетчеру сущностей XML строку, которая должна быть абсолютным URL-адресом... но это не так. Это говорит о том, что URL-адрес не имеет «протокола»; например бит перед двоеточием в «http://example.com» или «mailto:[email protected]».

Кроме того, во вложенном сообщении об исключении, похоже, говорится, что предполагаемый URL-адрес, который он пытается проанализировать, — "[B@22732273". Теперь это является большой подсказкой, потому что это то, что вы получите, если вызовете toString для объекта byte[].

Итак, мой предварительный диагноз заключается в том, что некоторый код, который вы нам не показали, передает массив байтов, хотя на самом деле он должен передавать объект, который будет разобран как строка URL.

person Stephen C    schedule 27.07.2012
comment
b в тесте — это byteArray в первом фрагменте кода. Я изменил тест так, чтобы он передал FileInputStream в InputReader вместо использования общих IOUtils, и это сработало. А в приложении тогда работало при передаче ByteArrayInputStream, созданного из byte[]. Так что я все еще не мудрее. - person blank; 27.07.2012